home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 095 / rbbssrc2.arc / RBBS-PC.BAS next >
BASIC Source File  |  1987-03-15  |  199KB  |  5,680 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS CPC15-1A, Copyright 1987 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR REMOVE LINES 3-31
  4. 9 'by D. Thomas Mack, 10210 Oxfordshire Road, Great Falls, VA 22066
  5. 10 '  Jon J. Martin, 4396 N. Prairie Willow Ct., Concord, CA 94521
  6. 11 '  Ken Goosens, 5020 Portsmouth Road, Fairfax, VA 22032
  7. 13 '
  8. 14 ' *******************************NOTICE*************************************
  9. 15 ' *  A limited license is granted to all users of this program and it's    *
  10. 16 ' *  companion program, CONFIG (version 3.00), to make copies of this      *
  11. 17 ' *  program and distribute the copies to other users, on the following    *
  12. 18 ' *  conditions:                                                           *
  13. 19 ' *    1.   The notices contained in lines 3 through 59 of the program     *
  14. 20 ' *         are not altered, bypassed, or removed.                         *
  15. 21 ' *    2.   The program is not to be distributed to others in modified     *
  16. 22 ' *         form (i.e. the line numbers must remain the same).             *
  17. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  18. 24 ' *         for copying or distributing these programs without an express  *
  19. 25 ' *         written agreement with D. Thomas Mack, The Second Ring, 10210  *
  20. 26 ' *         Oxfordshire Road, Great falls, Virginia 22006                  *
  21. 27 ' *                                                                        *
  22. 28 ' *       Copyright (c) 1983-1987 D. Thomas Mack, The Second Ring          * 'CPC151A5
  23. 29 ' **************************************************************************
  24.    '
  25.    ' $INCLUDE: 'RBBS-VAR.BAS'
  26.    '
  27.    ' $SUBTITLE: 'Main-line RBBS-PC Program'
  28.     J = 54
  29.     REDIM OPT.SEC(J)
  30.     CONFIG.FILENAME$ = "RBBS-PC.DEF"
  31.     CALL GETCOMND (DEBUG)
  32.     SUBROUTINE.PARAMETER = -62
  33.     CALL READDEF
  34.     CALL MLINIT (1)
  35.     IF RECYCLE.TO.DOS OR _
  36.        DEBUG OR _
  37.        EXIT.TO.DOORS THEN _
  38.        GOTO 100
  39.     SUBROUTINE.PARAMETER = - 9
  40.     CALL CARRIER
  41.     IF SUBROUTINE.PARAMETER THEN _
  42.        CALL COPYWRIT
  43. 100 CLEAR:'                                               Erase all variables
  44.     ON ERROR GOTO 13000:'                                 Set ERROR trap
  45.     DEF SEG:'                                             Point to BASIC
  46.     WIDTH 80:'                                            Set Screen Width
  47.     SCREEN 0,0,0:'                                        Text, No color, Pg 0
  48.     KEY OFF:'                                             Line 25 turned off
  49.     DEFINT A-Z:'                                          All var. integer
  50. ' ********************* Variable Definitions ********************************
  51. 102 ADIM = 99
  52.     MM = 999
  53.     BX = 50
  54.     J = 54
  55.     REDIM OPT.SEC(J)
  56.     REDIM CATEGORY.NAME$(BX),CATEGORY.CODE$(BX),CATEGORY.DESC$(BX)
  57.     REDIM A$(ADIM)                      ' Message line table
  58.     REDIM B$(ADIM)                      ' Message line table
  59.     REDIM M(MM,2)                       ' Message pointers
  60. 104 ACKNOWLEDGE$ = CHR$(6)
  61.     ACTIVE.MENU$ = "B"
  62.     ACTIVE.MESSAGE$=CHR$(225)
  63.     BACKSPACE$ = CHR$(8) + CHR$(32) + CHR$(8)
  64.     BACK.ARROW$ = CHR$(29) + CHR$(32) + CHR$(29)
  65.     C.L = 24
  66.     CANCEL$ = CHR$(24)
  67.     COLOR.RESET$=CHR$(27)+"[00;37;40m"
  68.     CONFIG.FILENAME$ = "RBBS-PC.DEF"
  69.     CARRIAGE.RETURN$ = CHR$(13)
  70.     DELETED.MESSAGE$=CHR$(226)
  71.     END.TRANSMISSION$ = CHR$(4)
  72.     ESCAPE$ = CHR$(27)
  73.     FALSE = 0
  74.     F1.KEY = 59
  75.     F10.KEY = 68
  76.     GRN$ = "MAIN"
  77.     LINE.FEED$ = CHR$(10)
  78.     LINE.FEEDS = NOT FALSE
  79.     LINEEDIT.CHK$ = CHR$(9)+LINE.FEED$+CHR$(11)+CHR$(12)+CHR$(127)+CHR$(8)+CHR$(7)+CHR$(26)+CHR$(227)
  80.     LINEMES$ = SPACE$(74)              ' fixed length string workspace
  81.     LOCK.STATUS$ = "UM UU UB UD"
  82.     NEGATIVE.ACKNOWLEDGE$ = CHR$(21)
  83.     NO.ADVANCE = FALSE
  84.     PRESS.ENTER$ = " (Press [ENTER] to quit)"
  85.     PRIVATE.DOOR = FALSE
  86.     RIGHT.MARGIN = 72
  87.     RETURN.LINE.FEED$ = CARRIAGE.RETURN$ + LINE.FEED$
  88.     START.OF.HEADER$ = CHR$(1)
  89.     TIME.LOGGED.ON$ = SPACE$(8)
  90.     TRANSFER.OPTIONS$= _
  91.      "A)scii, X)modem, C)Xmodem/CRC, " + _
  92.      RETURN.LINE.FEED$ + _
  93.      "K)ermit, Y)modem, I)modem, G)ymodemG, W)xmodem, N)one"
  94.     TRUE = NOT FALSE
  95.     USER.DATA = FALSE
  96. 105 VERSION.ID$ = "CPC15.1A"
  97.     XOFF$ = CHR$(19)
  98.     XON$ = CHR$(17)
  99.   ' ******************** Logon Error Message Table ****************************
  100. 106 LG$(1) = "Registration Check Failed"
  101.     LG$(2) = "Sysop name attempted"
  102.     LG$(3) = "Locked out attempt"
  103.     LG$(4) = "Password Attempt Failed"
  104.     LG$(5) = "Auto Lockout done"
  105.     LG$(6) = "Name in use on another Node!"
  106.     LG$(7) = "300 Baud access not allowed!"
  107.     LG$(8) = "Locked reason read!"
  108.     LG$(9) = "Expired Subscription"
  109.     CALL GETCOMND (DEBUG)
  110.     SUBROUTINE.PARAMETER = 1
  111.     CALL READDEF
  112.     ARC.WORK$ = LEFT$(CALLERS.FILE$,2) + _
  113.                 "ARCWORK" + _
  114.                 MID$("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ", _
  115.                     VAL(NODE.ID$),1) + _
  116.                 ".DEF"
  117. '
  118. ' *****************************************************************************
  119. ' *  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE                             *
  120. ' *****************************************************************************
  121. '
  122. 108 CALLERS.FILE.INDEX = 1
  123.     CALL FINDIT (CALLERS.FILE$)
  124.     CLOSE 2
  125.     CLOSE 4
  126.     OPEN "R",4,CALLERS.FILE$,64
  127.     FIELD 4,64 AS CALLERS.RECORD$
  128.     IF OK AND LOF(4) > 0 THEN _
  129.        CALLERS.FILE.INDEX = LOF(4) / 64
  130.     IF CALLERS.FILE.INDEX < 1 THEN _
  131.        CALLERS.FILE.INDEX = 0
  132.     X$ = STRING$(13,0)
  133. 110 GET 4,CALLERS.FILE.INDEX
  134.     IF LEFT$(CALLERS.RECORD$,13) = X$ THEN _
  135.        CALLERS.FILE.INDEX = CALLERS.FILE.INDEX-1 : _
  136.        GOTO 110
  137. '
  138. ' *****************************************************************************
  139. ' *  TEST FOR COLOR GRAPHICS MONITOR AND ANSI.SYS SUPPORT TO ALLOW THE LOCAL  *
  140. ' *  SYSOP TO SEE THE SAME COLOR MENUS AND SCREENS THAT THE REMOTE USER SEES  *
  141. ' *****************************************************************************
  142. '
  143. 112 IF USE.COLOR THEN _
  144.        COLOR.SUPPORT = TRUE : _
  145.        LOCAL.USER = TRUE : _
  146.        A$ = COLOR.RESET$ : _
  147.        CALL TPUT
  148.     LOCAL.USER = FALSE
  149.     UPLOAD.DRIVE.FILE$ = RIGHT$(DOWNLOAD.DRIVES$,1)+":FREESPAC.UPL"
  150. '
  151. ' *****************************************************************************
  152. ' *  TEST FOR MESSAGE FILE PRESENT (ABORT IF NOT PRESENT)                     *
  153. ' *****************************************************************************
  154. '
  155. 135 ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  156.     ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  157.     GOSUB 4910
  158.     GET 1,NODE.RECORD.INDEX
  159. '
  160. ' *****************************************************************************
  161. ' *  TEST FOR TIMED EXIT ACTIVE                                               *
  162. ' *****************************************************************************
  163. '
  164. 140 IF TIME.TO.DROP.TO.DOS > 0 THEN _
  165.        GOSUB 63000
  166. '
  167. ' *****************************************************************************
  168. ' *  GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER    *
  169. ' *****************************************************************************
  170. '
  171. 150 SYSOP.AVAILABLE = VAL(MID$(MESSAGE.RECORD$,32,2))
  172.     SYSOP.ANNOY = VAL(MID$(MESSAGE.RECORD$,34,2))
  173.     SYSOP.NEXT = VAL(MID$(MESSAGE.RECORD$,36,2))
  174.     PRINTER = VAL(MID$(MESSAGE.RECORD$,38,2))
  175.     IF TURN.PRINTER.OFF THEN _
  176.        PRINTER = FALSE
  177.     EXIT.TO.DOORS = VAL(MID$(MESSAGE.RECORD$,40,2))
  178.     SNOOP = VAL(MID$(MESSAGE.RECORD$,58,2))
  179.     MID$(MESSAGE.RECORD$,57,1)="I"
  180.     PUT 1,NODE.RECORD.INDEX
  181.     GOSUB 12985
  182. '
  183. ' *****************************************************************************
  184. ' *  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER                       *
  185. ' *****************************************************************************
  186. '
  187. 160 CALL MLINIT (4)
  188. '
  189. ' *****************************************************************************
  190. ' *  TEST FOR SPECIAL FILE TRANSFER PROTOCOL SUPPORT                          *
  191. ' *****************************************************************************
  192. '
  193. 165 CALL PROTOCOL
  194. '
  195. ' *****************************************************************************
  196. ' *  DISPLAY RBBS-PC MAIN FUNCTION KEY DISPLAY                                *
  197. ' *****************************************************************************
  198. '
  199. 170 FOR FUNCTION.KEY.INDEX = 1 TO 10
  200.         KEY FUNCTION.KEY.INDEX,""
  201.     NEXT
  202.     CALL LOADNEW (M())
  203. '
  204. ' *****************************************************************************
  205. ' * IF RUNNING MORE THAN ONE NODE IN A DOS 3.X ENVIRONMENT (OR HIGHER) UNDER  *
  206. ' * MULTILINK, THEN SET THE "SHARE.IT" INDICATOR ON SO THAT ALL FILES CAN BE  *
  207. ' * ACCESSED BY ALL PARTITIONS IN A MULTI-TASKING ENVIRONMENT (I.E. MULTI-    *
  208. ' * LINK).                                                                    *
  209. ' *****************************************************************************
  210. '
  211. '    IF DOS.VERSION > 2 AND _
  212. '       MAXIMUM.NUMBER.OF.NODES > 1 AND _
  213. '       MULTI.LINK.PRESENT THEN _
  214. '          SHARE.IT = TRUE
  215. '
  216. ' *****************************************************************************
  217. ' *  INITIALIZE FILE MANAGEMENT SYSTEM, CHECK FOR LOCAL BBS MODE              *
  218. ' *****************************************************************************
  219. '
  220. 175 CALL OPENMSG
  221.     IF EC = 64 THEN _
  222.        EC = 0 : _
  223.        GOTO 5360
  224.     FIELD 1, 128 AS MESSAGE.RECORD$
  225.     CALL CTLINES (MAX.ENTRIES)
  226.     REDIM CATEGORY.NAME$(MAX.ENTRIES),CATEGORY.CODE$(MAX.ENTRIES),_
  227.           CATEGORY.DESC$(MAX.ENTRIES)
  228.     CALL INITFMS (CATEGORY.NAME$(),CATEGORY.CODE$(), _
  229.                   CATEGORY.DESC$(),NUM.CATEGORIES)
  230.     LOCAL.USER.MODE = (RIGHT$(COM.PORT$,1)<"1")
  231.     CALL BRKFNAME (CALLERS.FILE$,DRV$,X$,Y$,TRUE)
  232.     NODE.WORK.FILE$ = DRV$ + MID$(NODE.ID$,2) + ".BAT"
  233.     SECONDS.PER.SESSION! = MINUTES.PER.SESSION! * 60
  234.     IF NOT LOCAL.USER.MODE THEN _
  235.        GOTO 180
  236.     LOCAL.USER = TRUE
  237.     BPS = -6
  238.     EIGHT.BIT = TRUE
  239.     SNOOP = TRUE
  240.     RECYCLE.TO.DOS = TRUE
  241.     IF EXIT.TO.DOORS THEN _
  242.        CALL AMORPM : _
  243.        CALL READPROF : _
  244.        GOTO 410
  245.     GOTO 345
  246. 180 SUBROUTINE.PARAMETER = 2
  247.     CALL LINE25
  248. '
  249. ' *****************************************************************************
  250. ' * WAIT FOR THE PHONE TO RING AND ANSWER IT                                  *
  251. ' *****************************************************************************
  252.     SUBROUTINE.PARAMETER = 1
  253. 200 CALL ANSWERIT
  254.     IF EC > 1 THEN _
  255.        GOTO 13000
  256.     ON SUBROUTINE.PARAMETER GOTO 410,330,822,10595,13540,202
  257. 202 GOSUB 60010
  258.     SUBROUTINE.PARAMETER = 3
  259.     GOTO 200
  260. 330 GOSUB 21280
  261.     IF C.L <> 1 THEN _
  262.        LOCATE 22,28
  263.     PRINT "CONNECT";STR$(BAUD.TEST);"    "
  264. '
  265. ' *****************************************************************************
  266. ' *  DISPLAY WELCOME LINE                                                     *
  267. ' *****************************************************************************
  268. '
  269. 345 LOCATE 24,1
  270.     SUBROUTINE.PARAMETER = 1
  271.     CALL AMORPM
  272.     CALL FINDTIME (USER.LOGON.TIME!)
  273.     TIME.LOGGED.ON$ = TIME$
  274.     LINES.PRINTED = 0
  275.     EXPERT.USER.DEF = EXPERT.USER
  276.     EXPERT.USER = FALSE
  277.     CALL QTPUT("WELCOME TO " + RBBS.NAME$,1)
  278.     TEST.PARITY = TRUE
  279.     FILE.NAME$ = LEFT$(WELCOME.FILE$,2) + "PRELOG"
  280. 346 CALL FINDIT (FILE.NAME$)
  281.     IF OK THEN _
  282.        BYPASS.TIME.CHECK = TRUE : _
  283.        CALL BUFFILE (FILE.NAME$) : _
  284.        BYPASS.TIME.CHECK = FALSE
  285.     FF = FALSE
  286. '
  287. ' *****************************************************************************
  288. ' *  GET USER NAME                                                            *
  289. ' *  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)       *
  290. ' *****************************************************************************
  291. '
  292. 400 CALL SKIPLINE(1)
  293.     UPPER.CASE = FALSE
  294.     EXPERT.USER = EXPERT.USER.DEF
  295.     A1$ = "What is your "
  296.     GOSUB 12500
  297.     CALL COMMINFO
  298.     IF FF THEN _
  299.        LOGON.ERROR.INDEX = 1 : _
  300.        GOTO 10620
  301.     IF RESTRICT.BAUD = -1 AND BPS = -1 THEN _
  302.        LOGON.ERROR.INDEX = 7 : _
  303.        GOTO 10620
  304. '
  305. ' *****************************************************************************
  306. ' *  CHECK IF SAME USER ON ANOTHER NODE                                       *
  307. ' *****************************************************************************
  308. '
  309. 410 NODE.INDEX = 2
  310.     XX = NODES.IN.SYSTEM + 1
  311. 412 IF NODE.INDEX > XX THEN _
  312.        GOTO 430
  313.     GET 1,NODE.INDEX
  314.     IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  315.        GOTO 420
  316.     NODE.INDEX = NODE.INDEX + 1
  317.     GOTO 412
  318. 420 IF MID$(MESSAGE.RECORD$,57,1) = "A" THEN _
  319.        LOGON.ERROR.INDEX = 6 : _
  320.        LG$(6) = LG$(6) + LEFT$(MESSAGE.RECORD$,25) : _
  321.        GOTO 10620
  322.     FIRST.NAME$ = LEFT$(MESSAGE.RECORD$,INSTR(MESSAGE.RECORD$, " ")-1)
  323.     IF NOT PRIVATE.DOOR THEN _
  324.        CALL QTPUT(FIRST.NAME$ + ", welcome back!",1)
  325.     GOTO 430
  326. '
  327. ' *****************************************************************************
  328. ' *  TEST FOR REMOTE SYSOP LOGGING ON                                         *
  329. ' *****************************************************************************
  330. '
  331. 430 GET 1,NODE.RECORD.INDEX
  332.     SAME.USER = (ACTIVE.USER.NAME$ = LEFT$(MESSAGE.RECORD$,LEN(ACTIVE.USER.NAME$)))
  333.     IF FIRST.NAME$ = SYSOP.PASSWORD.1$ AND _
  334.        LAST.NAME$ = SYSOP.PASSWORD.2$ THEN _
  335.        UPPER.CASE = FALSE : _
  336.        CI$ = "REMOTE" : _
  337.        GOTO 829
  338. '
  339. ' *****************************************************************************
  340. ' *  TEST FOR SYSOP NAME ATTEMPT                                              *
  341. ' *****************************************************************************
  342. '
  343. 445 IF INSTR(ACTIVE.USER.NAME$,"SYSOP") OR _
  344.        INSTR(ACTIVE.USER.NAME$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  345.        LOGON.ERROR.INDEX = 2 : _
  346.        GOTO 10620
  347. '
  348. ' *****************************************************************************
  349. ' *  REMOVE INVALID CHARACTERS FROM USER NAME                                 *
  350. ' *****************************************************************************
  351. '
  352. 455 CALL BADCHAR (ACTIVE.USER.NAME$)
  353.     IF ACTIVE.USER.NAME$ = "" THEN _
  354.        GOTO 400
  355. '
  356. ' *****************************************************************************
  357. ' *  CHECK FOR ACTIVE USER                                                    *
  358. ' *****************************************************************************
  359. '
  360. 457 GOSUB 12840
  361.     GOSUB 12850
  362.     GOSUB 12598
  363.     GOSUB 11482
  364.     CALL COMPDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,TODAY.COMPUTE.DATE!)
  365.     IF NOT FOUND THEN _
  366.        GOTO 700
  367.     GOSUB 12984
  368. '
  369. ' *****************************************************************************
  370. ' *  ACTIVE USER FOUND                                                        *
  371. ' *****************************************************************************
  372. '
  373. 459 GOSUB 9500
  374.     LAST.DATE.TIME.ON.SAVE$ = LAST.DATE.TIME.ON$
  375.     IF EXIT.TO.DOORS THEN _
  376.        USER.LOGON.TIME! = (VAL(MID$(LAST.DATE.TIME.ON$,10,2))*3600) + _
  377.                           (VAL(MID$(LAST.DATE.TIME.ON$,13,2))*60) : _
  378.        CALL TIMEREMAIN (TIME.REMAINING!)
  379.     USER.FILE.INDEX = LOC(5)
  380.     GOSUB 5135
  381.     GOSUB 5170
  382.     IF REG.DAYS.REMAINING < 0 THEN _
  383.        CALL QTPUT (LG$(9)+" - security reset to "+STR$(EXPIRED.SECURITY),1):_
  384.        LOGON.ERROR.INDEX = 9 : _
  385.        USER.SECURITY.LEVEL = EXPIRED.SECURITY : _
  386.        LSET SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)
  387.        GOSUB 5135
  388.     USER.SECURITY.LEVEL$ = STR$(USER.SECURITY.LEVEL)
  389.     IF USER.SECURITY.LEVEL > -1 THEN _
  390.        USER.SECURITY.LEVEL$ = MID$(USER.SECURITY.LEVEL$,2)
  391.     FILE.NAME$ = "LG" + USER.SECURITY.LEVEL$ + ".DEF"
  392.     BYPASS.TIME.CHECK = TRUE
  393.     CALL OPENWORK (FILE.NAME$)
  394.     IF EC = 0 THEN _
  395.        GOSUB 6000
  396.     BYPASS.TIME.CHECK = FALSE
  397. 460 IF USER.SECURITY.LEVEL >= MINIMUM.LOGON.SECURITY THEN _
  398.        GOTO 470
  399.     IF LOGON.ERROR.INDEX <> 9 THEN _
  400.        LOGON.ERROR.INDEX = 8
  401.     GOTO 10620
  402. 470 GOSUB 12989
  403.     CI$ = CITY.STATE$
  404.     ATTEMPTS.ALLOWED = 4
  405.     PASSWORD.SAVE$ = PASSWORD$
  406.     TEMP.SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  407.     MESSAGE.PASSWORD = FALSE
  408.     IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON$,8) THEN _
  409.        ELAPSED.TIME = 0 _
  410.     ELSE ELAPSED.TIME = CVI(ELAPSED.TIME$)
  411.     IF PASSWORD.SAVE$ = SPACE$(LEN(PASSWORD.SAVE$)) THEN _
  412.        GOSUB 755 : _
  413.        GOTO 800
  414. 480 IF PRIVATE.DOOR THEN _
  415.        Z$ = PASSWORD.SAVE$ : _
  416.        PASSWORD.FAILED = 0 : _
  417.        GOTO 644
  418.     IF Q = 3 THEN _
  419.        Z$ = B$(3) : _
  420.        ATTEMPTS = 1 : _
  421.        GOSUB 677 _
  422.     ELSE GOSUB 675
  423. 630 IF PASSWORD.FAILED THEN _
  424.        LOGON.ERROR.INDEX = 4 : _
  425.        GOTO 10620
  426. 643 GOSUB 41070
  427. 644 NEW.USER = FALSE
  428.     WK$ = RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,2))),2) + _   ' MM
  429.            "/" + _
  430.            RIGHT$(STR$(ASC(MID$(LIST.NEW.DATE$,3))),2) + _   ' DD
  431.            "/" + _
  432.            RIGHT$(STR$(ASC(LIST.NEW.DATE$)),2)               ' YY
  433.     LM$ = RIGHT$(WK$,2) + _                                 ' YY
  434.           LEFT$(WK$,2) + _                                  ' MM
  435.           MID$(WK$,4,2)                                     ' DD
  436.     IF MID$(LM$,3,1) = " " THEN _
  437.        MID$(LM$,3,1) = "0"
  438. 655 IF MID$(LM$,5,1) = " " THEN _
  439.        MID$(LM$,5,1) = "0"
  440. 660 CALL MUSIC (1)
  441.     GOTO 800
  442. '
  443. ' *****************************************************************************
  444. ' *  USER & MESSAGE PASSWORD VALIDATION                                       *
  445. ' *****************************************************************************
  446. '
  447. 665 SUBROUTINE.PARAMETER = 1
  448.     GOTO 678
  449. 667 SUBROUTINE.PARAMETER = 2
  450.     GOTO 678
  451. 670 SUBROUTINE.PARAMETER = 3
  452.     GOTO 678
  453. 675 SUBROUTINE.PARAMETER = 4
  454.     GOTO 678
  455. 677 SUBROUTINE.PARAMETER = 5
  456. 678 CALL PASSWORD
  457.     RETURN
  458. '
  459. ' *****************************************************************************
  460. ' *  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)                                  *
  461. ' *****************************************************************************
  462. '
  463. 700 EXPERT.USER = FALSE
  464.     IF RESTRICT.BAUD = -2 AND BPS = -1 THEN _
  465.        LOGON.ERROR.INDEX = 7 : _
  466.        A$ = "(300 BAUD ACCESS FOR REGISTERED USERS ONLY)  " : _
  467.        GOSUB 12976 : _
  468.        GOTO 10620
  469.     Z$ = FIRST.NAME$
  470.     GOSUB 12570
  471.     IF FOUND THEN _
  472.        GOSUB 12984 : _
  473.        GOTO 12595
  474.     Z$ = LAST.NAME$
  475.     GOSUB 12570
  476.     IF FOUND THEN _
  477.        GOSUB 12984 : _
  478.        GOTO 12595
  479. 710 IF USER.FILE.INDEX = 0 AND NOT SURVIVE.NOUSER.ROOM THEN _
  480.        GOTO 13540
  481. 720 USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL
  482. 725 IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY OR _
  483.        FIRST.NAME$ = LAST.NAME$ THEN _
  484.        LOGON.ERROR.INDEX = 3 : _
  485.        GOTO 10620
  486.     IF NOT REMEMBER.NEW.USERS THEN _
  487.        GOSUB 13700 : _
  488.        USER.FILE.INDEX = 0 : _
  489.        GOSUB 12960: _
  490.        PREV.LAST.ON$ = "00/00/00": _
  491.        GOTO 735
  492.     NEW.USER = TRUE
  493.     CALL OPENUSER
  494.     GOSUB 9450
  495.     GOSUB 12630
  496.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = LEFT$("NEWUSER",LEN.HASH)
  497.     IF START.INDIV>0 THEN _
  498.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  499.     PUT 5,USER.FILE.INDEX
  500. 730 GOSUB 12960
  501. 735 BYPASS.TIME.CHECK = TRUE
  502.     LINES.PRINTED = 0
  503.     FILE.NAME$ = NEWUSER.FILE$
  504.     STOP.INTERRUPTS = FALSE
  505.     GOSUB 1790
  506.     STOP.INTERRUPTS = TRUE
  507.     BYPASS.TIME.CHECK = FALSE
  508. 739 CALL QTPUT(ACTIVE.USER.NAME$ + " from " + CI$,1)
  509. 740 A$ = "<C>hange name/address, <D>isconnect, <R>egister"
  510.     GOSUB 12995
  511.     CALL ALLCAPSD (B$(),1)
  512.     Z$ = B$(1)
  513.     S = INSTR("CDR",Z$)
  514. 745 IF NOT REMEMBER.NEW.USERS THEN _
  515.        ON S GOTO 748,752,754
  516.     ON S GOTO 747,750,760
  517.     GOTO 740
  518. 747 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ +_
  519.                            " changed Name/Address",2)
  520.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  521.     PUT 5,USER.FILE.INDEX
  522.     GOSUB 12991
  523. 748 FF = FALSE
  524.     GOTO 400
  525. '
  526. ' *****************************************************************************
  527. ' *  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER)       *
  528. ' *****************************************************************************
  529. '
  530. 750 CALL UPDTCALR (ACTIVE.USER.NAME$ + " from " + CI$ + _
  531.                            " didn't register",2)
  532.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = STRING$(LEN.HASH,0)
  533.     PUT 5,USER.FILE.INDEX
  534.     GOSUB 12991
  535. 752 FF = FALSE
  536.     USER.FILE.INDEX = 0
  537.     GOTO 13540
  538. '
  539. ' *****************************************************************************
  540. ' *  GET AND VERIFY PASSWORD                                                  *
  541. ' *****************************************************************************
  542. '
  543. 754 CALL QTPUT ("GUEST privileges granted.  RE-REGISTER on future calls",1)
  544.     GOTO 832
  545. 755 IF PRIVATE.DOOR THEN _
  546.        B$(1) = PASSWORD$ : _
  547.        Z$ = B$(1) : _
  548.        GOSUB 1275 : _
  549.        RETURN
  550.     GOSUB 12800
  551.     A$ = "Re-enter PASSWORD for verification (Dots Echo)"
  552.     GOSUB 45010
  553.     SWAP Z$,B$(1)
  554.     CALL ALLCAPS (Z$)
  555.     IF B$(1) <> Z$ THEN _
  556.        CALL QTPUT ("Passwords Don't match!",1) : _
  557.        GOTO 755
  558.     RETURN
  559. '
  560. ' *****************************************************************************
  561. ' *  R - COMMAND FROM NEWUSER ROUTINE - REGISTER                              *
  562. ' *****************************************************************************
  563. '
  564. 760 GOSUB 755
  565.     CALL ALLCAPS (Z$)
  566.     LSET PASSWORD$ = Z$
  567.     CALL QTPUT("Please REMEMBER your password",1)
  568.     TEMP.SECURITY.LEVEL = USER.SECURITY.LEVEL
  569.     IF NEWUSER.SETS.DEFAULTS THEN _
  570.        GOSUB 42950 : _
  571.        BYPASS.TIME.CHECK = TRUE : _
  572.        GOSUB 43000 : _
  573.        BYPASS.TIME.CHECK = FALSE : _
  574.        GOSUB 43030 : _
  575.        GOSUB 42800 : _
  576.        GOSUB 42700 _
  577.     ELSE UPPER.CASE = FALSE : _
  578.          GR = 0 : _
  579.          USER.GRAPHIC.DEFAULT$ = " " : _
  580.          NULLS = FALSE : _
  581.          USER.TRANSFER.DEFAULT$ = " "
  582.     GOSUB 12900
  583.     CALL DEFAULTU
  584.     QUESTIONNAIRE$ = "RBBS-REG.DEF"
  585.     GOSUB 11510
  586.     LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  587. '
  588. ' *****************************************************************************
  589. ' *  LOGIN ALL USERS                                                          *
  590. ' *****************************************************************************
  591. '
  592. 800 MAIN.USER.FILE.INDEX = USER.FILE.INDEX
  593.     USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  594.     TIMES.LOGGED.ON = CVI(MID$(USER.OPTIONS$,1,2)) + 1
  595.     LINES.PRINTED = 0
  596.     GOSUB 9500
  597.     PREV.LAST.ON$ = LAST.DATE.TIME.ON$
  598.     IF PRIVATE.DOOR THEN _
  599.        GOTO 815
  600.     IF (EIGHT.BIT AND _
  601.        AUTODOWNLOAD.AVAILABLE) OR _
  602.        ASK.IDENTITY THEN _
  603.        CALL TESTUSER
  604.     CALL QTPUT ("Logging " + ACTIVE.USER.NAME$,1)
  605.     CALL QTPUT ("RBBS-PC " + VERSION.ID$ + " NODE " + NODE.ID$,1)
  606.     CALL QTPUT (" OPERATING AT " + BAUD.PARITY$,1)
  607.     ATTEMPTS = 0
  608. 805 IF EIGHT.BIT AND AUTODOWNLOAD.AVAILABLE THEN _
  609.        A$ = CHR$(7) + CHR$(9) + RETURN.LINE.FEED$ + _
  610.             CHR$(7) + "You may use " + _
  611.             CHR$(7) + "AUTODOWNLOADing!" + _
  612.             CHR$(7) + RETURN.LINE.FEED$ + CHR$(7) : _
  613.        GOSUB 12979 : _
  614.        CALL DELAYIT(4)
  615. 815 DOWNLOADS = CVI(USER.DOWNLOADS$)
  616.     UPLOADS = CVI(USER.UPLOADS$)
  617.     LAST.MESSAGE.READ = -LAST.MESSAGE.READ*(LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  618.     LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  619.                          MID$(USER.OPTIONS$,3)
  620.     LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + " " + TIME.LOGGED.ON$
  621.     MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  622.     IF START.INDIV>0 THEN _
  623.        MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  624.     LSET USER.NAME$ = ACTIVE.USER.NAME$
  625.     PUT 5,USER.FILE.INDEX
  626.     GOSUB 12991
  627.     IF PRIVATE.DOOR THEN _
  628.        GOTO 821
  629.     IF NOT SAME.USER THEN _
  630.        STOP.INTERRUPTS = WELCOME.INTERRUPTABLE : _
  631.        BYPASS.TIME.CHECK = TRUE : _
  632.        FILE.NAME$ = WELCOME.FILE$ : _
  633.        GOSUB 1790
  634.        BYPASS.TIME.CHECK = FALSE : _
  635.        STOP.INTERRUPTS = FALSE
  636. 816 IF NOT NEW.USER THEN _
  637.        CALL QTPUT("Times on:" + STR$(TIMES.LOGGED.ON) + _
  638.             "  Last time on was: " + PREV.LAST.ON$,1)
  639. 817 IF REMIND.FILE.TRANSFERS THEN _
  640.        A$ = "Files Downloaded:" + _
  641.             STR$(DOWNLOADS) + _
  642.             "  Uploaded:" + _
  643.             STR$(UPLOADS) : _
  644.        GOSUB 12977
  645. 820 LINES.PRINTED = 0
  646.     IF REMIND.PROFILE THEN _
  647.        GOSUB 5400
  648.     LINES.PRINTED = 0
  649. 821 CI$ = LEFT$(CI$ + SPACE$(2),INSTR(CI$ +SPACE$(2),SPACE$(2))-1)
  650.     GOTO 832
  651. '
  652. ' *****************************************************************************
  653. ' *  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE                                 *
  654. ' *****************************************************************************
  655. '
  656. 822 LOCATE 24,1
  657.     CALL FINDTIME (USER.LOGON.TIME!)
  658.     GOSUB 14500
  659.     LOCAL.USER = TRUE
  660.     WAIT.BEFORE.DISCONNECT = 32400
  661.     BPS = -6
  662.     CALL MUSIC (2)
  663.     IF LOCAL.PASSWORD$ = "NONE" THEN _
  664.        GOTO 828
  665.     A$ = "Enter PASSWORD (dots echo) "
  666.     PRINT A$;
  667.     Z$ = ""
  668.     INKEYS.PRESSED = 0
  669. 823 A$ = INKEY$
  670.     IF A$ = "" THEN _
  671.        GOTO 823
  672.     IF A$ = CARRIAGE.RETURN$ THEN _
  673.        GOTO 824
  674.     IF (A$ = CHR$(8)) AND (INKEYS.PRESSED > 0) THEN _
  675.        PRINT BACK.ARROW$; : _
  676.        INKEYS.PRESSED = INKEYS.PRESSED - 1 : _
  677.        IF LEN(Z$) > 1 THEN _
  678.           Z$ = LEFT$(Z$,LEN(Z$)-1) : _
  679.           GOTO 823 _
  680.        ELSE Z$ = "" : _
  681.           GOTO 823
  682.     IF ASC(A$) > 127 OR _
  683.        ASC(A$) < 32 THEN _
  684.        GOTO 823
  685.     Z$= Z$ + A$
  686.     PRINT ".";
  687.     INKEYS.PRESSED = INKEYS.PRESSED + 1
  688.     GOTO 823
  689. 824 PRINT A$;
  690.     CALL ALLCAPS (Z$)
  691.     IF Z$ <> LOCAL.PASSWORD$ THEN _
  692.        GOTO 13549
  693. 828 EIGHT.BIT = TRUE
  694.     GR = 1
  695.     CI$ = "LOCAL"
  696.     LINE.FEEDS = TRUE
  697.     RETURN.LINE.FEED$ = LINE.FEED$
  698.     USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL
  699. 829 FIRST.NAME$ = SYSOP.FIRST.NAME$
  700.     LAST.NAME$ = SYSOP.LAST.NAME$
  701.     ACTIVE.USER.NAME$ = "SYSOP"
  702.     USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL
  703.     GOSUB 5135
  704.     SYSOP = TRUE
  705.     REQ.QUES.ANSWERED = TRUE
  706.     REG.DAYS.REMAINING = 365
  707.     GOSUB 11482
  708.     CALL COMPDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,TODAY.COMPUTE.DATE!)
  709.     X$ = DATE$
  710.     PREV.LAST.ON$ = LEFT$(X$,6) + RIGHT$(X$,2)
  711.     SUBROUTINE.PARAMETER = 1
  712.     CALL AMORPM
  713.     IF LOCAL.USER THEN _
  714.        SNOOP = TRUE : _
  715.        SYSOP.NEXT = TRUE : _
  716.        GOSUB 33090
  717.     LINES.PRINTED = 0
  718. 832 IF REG.DAYS.REMAINING <= DAYS.TO.WARN AND _
  719.        RESTRICT.BY.DATE AND REG.DAYS.REMAINING > 0 THEN _
  720.        CALL QTPUT ("Subscription EXPIRES in"+STR$(REG.DAYS.REMAINING)+" days!",1) : _
  721.        CALL DELAYIT (5)
  722.     IF (NOT REQ.QUES.ANSWERED) AND _
  723.        REQUIRED.QUESTIONNAIRE$ <> "" THEN _
  724.        QUESTIONNAIRE$ = REQUIRED.QUESTIONNAIRE$: _
  725.        GOSUB 11510: _
  726.        IF OK THEN _
  727.           REQ.QUES.ANSWERED = TRUE
  728. 836 IF LOCAL.USER THEN _
  729.        SNOOP = TRUE : _
  730.        LINE.FEEDS = TRUE : _
  731.        CI$ = "LOCAL" : _
  732.        A = INSTR(TRANSFER.OPTIONS$,CARRIAGE.RETURN$) : _
  733.        IF A>0 THEN _
  734.           MID$(TRANSFER.OPTIONS$,A,1) = " "
  735. 837 Z$ = ACTIVE.USER.NAME$ + _
  736.             " on at " + _
  737.             CURRENT.DATE$ + _
  738.             ", " + _
  739.             TIM$ + _
  740.             " from " + _
  741.             CI$ + _
  742.             ", " + _
  743.             BAUD.PARITY$
  744.      NG$ = Z$ + SPACE$(128-LEN(Z$))
  745.      GOSUB 12860
  746.      CALL PRINTIT ("  " + Z$)
  747.      IF NEW.USER THEN _
  748.         CALL UPDTCALR ("NEWUSER",1) : _
  749.         CALL MUSIC (2) : _
  750.         NEW.USER = FALSE
  751. 842 SECONDS.PER.SESSION! = (MINUTES.PER.SESSION! + LIMIT.DAILY.TIME * ELAPSED.TIME) * 60
  752.     GOSUB 4910
  753.     CALLS.TODATE! = CALLS.TODATE! + 1 + SYSOP
  754.     GOSUB 24000
  755.     GET 1,NODE.RECORD.INDEX
  756.     MID$(MESSAGE.RECORD$,1,31) = ACTIVE.USER.NAME$ + SPACE$(31-LEN(ACTIVE.USER.NAME$))
  757.     MID$(MESSAGE.RECORD$,40,2) = " 0"
  758.     MID$(MESSAGE.RECORD$,55,2) = " 0"
  759.     MID$(MESSAGE.RECORD$,57,1) = "A"
  760.     MID$(MESSAGE.RECORD$,60,4) = BAUD.PARITY$
  761.     MID$(MESSAGE.RECORD$,72,2) = STR$(FALSE)
  762.     PUT 1,NODE.RECORD.INDEX
  763.     GOSUB 12985
  764.     SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  765.     SUBROUTINE.PARAMETER = 2
  766. 850 CALL LINE25
  767.     CALL SKIPLINE (1)
  768.     IF PRIVATE.DOOR OR EXIT.TO.DOORS THEN _
  769.        GOTO 900
  770.     IF M(1,1) < 1 THEN _
  771.        LAST.NEW = 0 _
  772.     ELSE CALL CTNEWFILES (PREV.LAST.ON$,M(),LAST.NEW)
  773.     IF LAST.NEW > 22 THEN _
  774.        A$ = "At least"_
  775.     ELSE A$ = ""
  776.     IF FMS.DIRECTORY$ <> "" THEN _
  777.        CALL QTPUT(A$ + STR$(LAST.NEW) + " NEW file(s) since last on",1) _
  778.     ELSE GOTO 852
  779.     IF NOT NEW.FILES.CHECK OR LAST.NEW < 1 THEN _
  780.        GOTO 852
  781.     L = LEN(DOWNLOAD.DRIVES$)
  782.     IF (NOT SKIP.FILES.LOGON) AND _
  783.        (USER.SECURITY.LEVEL >= MIN.SEC.TO.VIEW) AND _
  784.        USER.SECURITY.LEVEL >= OPT.SEC(18) THEN _
  785.           A$ = "Review new files to download ([Y],N)" :_
  786.           GOSUB 12995 :_
  787.           IF NOT NO THEN _
  788.              Q = 3:_
  789.              B$(2) = MID$(PREV.LAST.ON$,1,2) + MID$(PREV.LAST.ON$,4,2) +_
  790.                      MID$(PREV.LAST.ON$,7,2):_                       ' @ FORMAT
  791.              Y$ = B$(3) : _
  792.              CALL BRKFNAME (FMS.DIRECTORY$,DR$,Y$,X$,FALSE): _
  793.              B$(3) = Y$ : _
  794.              GOSUB 53000
  795. 852 IF LOCAL.USER AND SYSOP THEN _
  796.        GOTO 900
  797.     IF USER.SECURITY.LEVEL < OPT.SEC (2) OR ACTIVE.BULLETINS < 1 THEN _
  798.        GOTO 900
  799. 855 IF NOT BULLETINS.OPTIONAL THEN _
  800.        GOTO 860
  801.     IF NOT CHECK.BULLETIN.LOGON THEN _
  802.        ANS.INDEX = 0 : _
  803.        GOSUB 9760 : _
  804.        GOTO 900
  805.     CALL SKIPLINE (1)
  806.     A$ = "Skip the" + STR$(ACTIVE.BULLETINS) + " bulletins"
  807.     GOSUB 12995
  808.     IF YES THEN _
  809.        GOTO 900
  810. 860 GOSUB 9705
  811. 900 GOSUB 1900
  812.     SUBROUTINE.PARAMETER = 2
  813.     CALL LINE25
  814.     CALL CALLOPT
  815.     SECTION$ = "    "
  816.     IF PRIVATE.DOOR THEN _
  817.        GOSUB 20266 : _
  818.        GOSUB 1275 : _
  819.        GOTO 1205
  820. 955 GOSUB 4850
  821. '
  822. ' *****************************************************************************
  823. ' *                                                                           *
  824. ' *                           COMMAND PROCESSING                              *
  825. ' *                                                                           *
  826. ' *****************************************************************************
  827. '
  828. 1200 CLOSE 1
  829.      GOSUB 1280
  830. 1205 CHAT.AVAILABLE = TRUE
  831.      SUBROUTINE.PARAMETER = 1
  832.      STOP.INTERRUPTS = TRUE
  833.      NON.STOP = FALSE
  834.      Q = 0
  835.      GOSUB 12979
  836. 1210 GOSUB 41000
  837.      CALL DISPLAYTR (TIME.REMAINING!)
  838.      IF EXPERT.USER THEN _
  839.         GOTO 1230
  840.      LINES.PRINTED = 0
  841.      IF SUB.SECTION < BEG.FILE THEN _
  842.         IF SYSOP THEN _
  843.            FILE.NAME$ = MENU$(1) : _
  844.            GOSUB 43025
  845.      FILE.NAME$ = MENU$(MENU.INDEX)
  846.      GOSUB 43025
  847. 1230 CALL LINE25
  848.      CALL SKIPLINE (1)
  849.      IF CONFERENCE.MODE THEN _
  850.         A$ = GRN$ : _
  851.         GOSUB 12979
  852.      A$ = COMMAND.PROMPT$
  853.      GOSUB 12995
  854.      IF Q = 0 THEN _
  855.         GOTO 1230
  856. 1235 Z$ = B$(1)
  857.      IF LEN(Z$) < 1 THEN _
  858.         GOTO 1230
  859.      CALL ALLCAPS (Z$)
  860.      CALL SRCHCMND (SUB.SECTION,FF)
  861.      IF FF < 1 THEN _
  862.         GOSUB 1305 : _
  863.         GOTO 1230
  864.      IF ASC(Z$) = 32 THEN _
  865.         GOTO 1230
  866.      IF USER.SECURITY.LEVEL < OPT.SEC(FF) THEN _
  867.         VIOLATION$ = SECTION$+" "+Z$ : _
  868.         GOSUB 1380 : _
  869.         GOTO 1205
  870.         ON FF GOSUB _
  871.                  1400, _               ' A)nswer questionnaire 1
  872.                  9700, _               ' B)ulletins
  873.                  1800, _               ' C)omments
  874.                  10970, _              ' D)oor (exit to)
  875.                  2000, _               ' E)nter a message
  876.                  1275, _               ' F)ile system (exit to)
  877.                  1760, _               ' I)nitial welcome redisplayed
  878.                  5300, _               ' J)oin a conference
  879.                  3900, _               ' K)ill a message
  880.                  4700, _               ' O)perator page
  881.                  1900, _               ' P)ersonal mail (look for)
  882.                  4330, _               ' R)ead messages
  883.                  4340, _               ' S)can message headers
  884.                  4320, _               ' T)opic msg scan
  885.                  1285, _               ' U)tilities (exit to)
  886.                  5800, _               ' V)iew a conference
  887.                  9800, _               ' W)ho's on other nodes displayed 17
  888.                 20180, _               ' D)ownload 1
  889.                 10570, _               ' G)oodbye
  890.                 20150, _               ' L)ist
  891.                 53000, _               ' N)ew
  892.                 52900, _               ' S)can
  893.                 20400, _               ' U)pload 6
  894.                 20140, _               ' V)iew ARC Contents
  895.                  5500, _               ' B)aud rate change 300==>450 1
  896.                  9100, _               ' C)lock (time & time on)
  897.                  42800, _              ' F)ile transfer protocol
  898.                  43000, _              ' G)raphics
  899.                  5200, _               ' L)ines per page
  900.                  10925, _              ' M)essage margin
  901.                  5110, _               ' P)assword change
  902.                  5400, _               ' R)eview preferences
  903.                  4850, _               ' S)tatistics displayed
  904.                  1500, _               ' T)oggle
  905.                  10090, _              ' U)serlog displayed 11
  906.                  1325, _               ' H)elp 1
  907.                  1325, _               ' ?)help
  908.                  1250, _               ' Q)uit
  909.                  4240, _               ' X)expert toggle on/off 4
  910.                  10070, _              ' 1) List comments file 1
  911.                  10090, _              ' 2) List callers file
  912.                  10390, _              ' 3) Recover a message
  913.                  10530, _              ' 4) Erase comments
  914.                  11000, _              ' 5) User file maintenance
  915.                  33070, _              ' 6) Toggle page bell on/off
  916.                  10930                 ' 7) Exit to DOS 2.x or above 7
  917.      GOTO 1205
  918. ' ************************************************************
  919. ' *              QUIT COMMAND (GLOBAL)                       *
  920. ' ************************************************************
  921. 1250 IF Q>1 THEN _
  922.         ANS.INDEX = 2: _
  923.         GOTO 1270
  924. 1260 ANS.INDEX = 1
  925.      IF EXPERT.USER THEN _
  926.         A$ = "QUIT to F,[M],U,S"_
  927.      ELSE _
  928.         A$ = "QUIT to F)ile, [M]ain, U)til section or S)ystem (hang up) ([ENTER]=M)"
  929.      GOSUB 12995
  930.      IF Q = 0 THEN _
  931.         Q = 1: _
  932.         B$(1) = "M"
  933. 1270 Z$ = B$(ANS.INDEX)
  934.      CALL ALLCAPS (Z$)
  935.      ON INSTR("FMUS",Z$) GOTO 1275,1280,1285,10570
  936.      GOTO 1260
  937. 1275 LSET SECTION$ = "FILE"
  938.      SECTION.OPTS$ = FILE.OPTS$
  939.      SUB.SECTION = BEG.FILE
  940.      MENU.INDEX = 3
  941.      GOTO 1295
  942. 1280 LSET SECTION$ = "MAIN"
  943.      SECTION.OPTS$ = MAIN.OPTS$
  944.      SUB.SECTION = BEG.MAIN
  945.      MENU.INDEX = 2
  946.      GOTO 1295
  947. 1285 LSET SECTION$ = "UTIL"
  948.      SECTION.OPTS$ = UTIL.OPTS$
  949.      SUB.SECTION = BEG.UTIL
  950.      MENU.INDEX = 4
  951.      GOTO 1295
  952. 1295 ACTIVE.MENU$ = LEFT$(SECTION$,1)
  953.      IF SHOW.SECTION THEN _
  954.         SECTION.PROMPT$ = SECTION$ _
  955.      ELSE SECTION.PROMPT$ = "Your"
  956.      IF COMMANDS.IN.PROMPT=0 THEN _
  957.          SECTION.OPTS$ = ""
  958.      COMMAND.PROMPT$ = SECTION.PROMPT$ + " command" + SECTION.OPTS$
  959.      RETURN
  960. 1300 CALL QTPUT ("Message base " + GRN$,1)
  961.      RETURN
  962. 1305 CALL QTPUT(PRESENT.OPTS$,1)
  963.      CALL QTPUT(CALLERS.OPTS$,1)
  964.      RETURN
  965. ' ****************************************************************
  966. ' *                     HELP (GLOBAL)                            *
  967. ' ****************************************************************
  968. 1325 CALL HELP (SUB.SECTION,USER.GRAPHIC.DEFAULT$,_
  969.                 MID$("MAINFILEUTIL",(MENU.INDEX-2)*4+1,4))
  970.      IF SUBROUTINE.PARAMETER = -1 THEN _
  971.         RETURN 10595
  972.      RETURN
  973. '
  974. ' *****************************************************************************
  975. ' *  RECORD SECURITY VIOLATIONS                                               *
  976. ' *****************************************************************************
  977. '
  978. 1380 A$ = "SYSOP must authorize"
  979.      GOSUB 1397
  980.      CALL UPDTCALR ("SV!-"+VIOLATION$,2)
  981.      CALL MUSIC (3)
  982.      VIOLATIONS.THIS.SESSION = VIOLATIONS.THIS.SESSION + 1
  983.      IF MAXIMUM.VIOLATIONS = 0 OR VIOLATIONS.THIS.SESSION <= MAXIMUM.VIOLATIONS THEN _
  984.         RETURN
  985. 1385 IF USER.FILE.INDEX < 1 THEN _
  986.         RETURN
  987.      A$ = "SECURITY VIOLATION!  Sysop can reinstate"
  988.      IF USER.SECURITY.LEVEL <= MINIMUM.LOGON.SECURITY THEN _
  989.         A$ = "" : _
  990.         USER.SECURITY.LEVEL = USER.SECURITY.LEVEL-1 _
  991.      ELSE USER.SECURITY.LEVEL = MINIMUM.LOGON.SECURITY
  992. 1386 GOSUB 12979
  993.      LOGON.ERROR.INDEX = 5
  994.      GOSUB 12989
  995.      CALL OPENUSER
  996.      GOSUB 9450
  997.      GET 5,USER.FILE.INDEX
  998.      LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  999.      PUT 5,USER.FILE.INDEX
  1000.      GOTO 10620
  1001. 1397 A$ = "Sorry, " + FIRST.NAME$ + ", " + A$
  1002.      GOTO 12976
  1003. '
  1004. ' *****************************************************************************
  1005. ' *  END KEY - FORCE CURRENT USER OFF AND LOCK THEM OUT                       *
  1006. ' *****************************************************************************
  1007. '
  1008. 1398 CALL CARRIER
  1009.      IF SUBROUTINE.PARAMETER THEN _
  1010.         RETURN
  1011.      FUNCTION.KEY = 0
  1012.      IF INSTR("MUF",ACTIVE.MENU$)>0 THEN_
  1013.         GOTO 1399
  1014.      CURSOR.LINE = CSRLIN
  1015.      CURSOR.ROW = POS(0)
  1016.      LOCATE 25,1
  1017.      PRINT SPACE$(79);
  1018.      LOCATE 25,1
  1019.      PRINT "Cannot FORCE OFF until user reaches MAIN menu";
  1020.      CALL DELAYIT (1)
  1021.      LOCATE CURSOR.LINE,CURSOR.ROW
  1022.      SUBROUTINE.PARAMETER = 1
  1023.      CALL LINE25
  1024.      RETURN
  1025. 1399 A$ = FIRST.NAME$ + ", goodbye and don't call back"
  1026.      GOSUB 12975
  1027.      IF USER.FILE.INDEX < 1 THEN _
  1028.         GOTO 10698
  1029.      USER.SECURITY.LEVEL = MINIMUM.LOGON.SECURITY - 1
  1030.      GOTO 1386
  1031. '
  1032. ' *****************************************************************************
  1033. ' *  ANSWER - COMMAND FROM MAIN MENU (ANSWER QUESTIONNAIRE)                   *
  1034. ' *****************************************************************************
  1035. '
  1036. 1400 IF Q > 1 THEN _
  1037.         ANS.INDEX = 2:_
  1038.         GOTO 1407
  1039. 1402 CALL BUFFILE (ANS.MENU$)
  1040.      IF NOT OK THEN _
  1041.         CALL QTPUT("No questionnaires available",1):_
  1042.         RETURN
  1043. 1405 A$ = "Answer which questionnaire"
  1044.      GOSUB 12998
  1045.      IF Q = 0 THEN _
  1046.         RETURN
  1047.      CALL CARRIER
  1048.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1049.         RETURN 10595
  1050.      ANS.INDEX = 1
  1051. 1407 Z$ = B$(ANS.INDEX)
  1052.      CALL WORDINFILE (ANS.MENU$,Z$,FOUND)
  1053.      IF NOT FOUND THEN _
  1054.         CALL QTPUT ("No such questionnaire "+Z$,1):_
  1055.         GOTO 1402
  1056.      QUESTIONNAIRE.HOLD$ = Z$
  1057.      QUESTIONNAIRE$ = Z$+".DEF"
  1058.      GOSUB 11510
  1059. 1415 IF NOT OK THEN _
  1060.         CALL UPDTCALR ("Missing questionnaire " + Z$,2) : _
  1061.         GOTO 1402
  1062. 1424 CLOSE 2
  1063.      CALL UPDTCALR (QUESTIONNAIRE.HOLD$ + " Questionnaire answered",2)
  1064.      RETURN
  1065. '
  1066. ' *****************************************************************************
  1067. ' *             TOGGLE COMMAND (UTILITIES)                                    *
  1068. ' *****************************************************************************
  1069. '
  1070. 1500 IF Q>1 THEN _
  1071.         ANS.INDEX = 2 : _
  1072.         LAST.INDEX = Q : _
  1073.         GOTO 1510
  1074. 1502 ANS.INDEX = 1
  1075.      CALL QTPUT("TOGGLE which options on/off?"+PRESS.ENTER$,1)
  1076.      A$ = "A)utodownload,B)ulletin,C)ase,F)ile,L)ine feeds,N)ulls,X)expert,!)bell"
  1077.      GOSUB 12995
  1078.      IF Q=0 THEN _
  1079.         RETURN
  1080.      LAST.INDEX = Q
  1081. 1510 Z$ = B$(ANS.INDEX)
  1082.      CALL ALLCAPS (Z$)
  1083.      FF = INSTR("ABCFLNX!",Z$)
  1084.      IF FF<1 THEN _
  1085.         GOTO 1502
  1086.      ON FF GOSUB _
  1087.          1550, _         'Autodownload
  1088.          4120, _         'Bulletin review on logon
  1089.         42960, _         'Case change
  1090.          4140, _         'File review on logon
  1091.          4100, _         'Line feeds
  1092.         42710, _         'Nulls
  1093.          4240, _         'Expert
  1094.          4200            'Bell
  1095.      ANS.INDEX = ANS.INDEX + 1
  1096.      IF ANS.INDEX > LAST.INDEX THEN _
  1097.         GOTO 1502
  1098.       GOTO 1510
  1099. 1550 IF NOT AUTODOWNLOAD.AVAILABLE THEN _
  1100.         CALL TESTUSER : _
  1101.         IF COM.PROGRAM = 0 OR COM.PROGRAM > 3 THEN _
  1102.            GOTO 1560
  1103.      AUTODOWNLOAD.AVAILABLE = NOT AUTODOWNLOAD.AVAILABLE
  1104. 1560 A$ = "Autodownload "+MID$("offon",1-3*AUTODOWNLOAD.AVAILABLE,3)
  1105.      GOSUB 12979
  1106.      RETURN
  1107. '
  1108. ' *****************************************************************************
  1109. ' *  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)                     *
  1110. ' *****************************************************************************
  1111. '
  1112. 1760 FILE.NAME$ = WELCOME.FILE$
  1113. 1765 GOSUB 1790
  1114.      RETURN
  1115. 1790 GOSUB 43030
  1116.      CALL BUFFILE (FILE.NAME$)
  1117.      CALL CARRIER
  1118.      IF SUBROUTINE.PARAMETER = -1 THEN _
  1119.         RETURN 10595
  1120.      RETURN
  1121. '
  1122. ' *****************************************************************************
  1123. ' *  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)                     *
  1124. ' *****************************************************************************
  1125. '
  1126. 1800 A$ = "Leave a comment for " + _
  1127.           SYSOP.FIRST.NAME$ + _
  1128.           " (Y/N)"
  1129.      CALL SKIPLINE (1)
  1130.      GOSUB 12995
  1131.      RIGHT.MARGIN = 72
  1132.      IF NOT YES THEN _
  1133.         GOSUB 12979 : _
  1134.         RETURN
  1135. 1840 IF CONFERENCE.MODE AND _
  1136.         COMMENTS.AS.MESSAGES THEN _
  1137.         CALL QTPUT ("Comments can't be left in a Conference",1) : _
  1138.         RETURN
  1139.      IF CONFERENCE.MODE THEN _
  1140.         COMMENTS.IN.CONFERENCE = 1 : _
  1141.         IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  1142.            GOSUB 5350 _
  1143.         ELSE GOSUB 5360
  1144.      MESSAGE.TO$ = "SYSOP"
  1145.      SUBJECT$ = "COMMENT"
  1146.      IF (ACTIVE.MESSAGES > = MAXIMUM.MESSAGES OR _
  1147.          NEXT.MESSAGE.RECORD + 5 > HIGHEST.MESSAGE.RECORD OR _
  1148.          NOT COMMENTS.AS.MESSAGES ) THEN _
  1149.         A$ = SYSOP.FIRST.NAME$ + " UNABLE to reply.  Leave a comment? (Y/N)" : _
  1150.         GOSUB 12995 : _
  1151.         IF NOT YES THEN _
  1152.            GOSUB 12979 : _
  1153.            RETURN : _
  1154.         ELSE SYSOP.COMMENT = TRUE : _
  1155.              GOTO 2007
  1156.      SYSOP.COMMENT = FALSE
  1157.      SYSOP.MESSAGE = TRUE
  1158.      FT$ = "comment"
  1159.      GOTO 2010
  1160. 1850 CLOSE 2
  1161.      BX = &H3
  1162.      EN$ = COMMENTS.FILE$
  1163.      GOSUB 12992
  1164.      IF SHARE.IT THEN _
  1165.         OPEN COMMENTS.FILE$ FOR APPEND SHARED AS #2 _
  1166.      ELSE OPEN "A",2,COMMENTS.FILE$                                  ' FORMAT
  1167.      A$ = FIRST.NAME$ + ", Thanks for comments!"
  1168.      GOSUB 12976
  1169.      SUBROUTINE.PARAMETER = 2
  1170.      CALL AMORPM
  1171.      PRINT #2,ACTIVE.USER.NAME$,CURRENT.DATE$,TIM$,"Node ";NODE.ID$
  1172.      FOR X = 1 TO LINES.IN.MESSAGE
  1173.        PRINT #2,A$(X)
  1174.      NEXT
  1175.      PRINT #2,CARRIAGE.RETURN$
  1176.      CLOSE 2
  1177.      BX = &H3
  1178.      EN$ = COMMENTS.FILE$
  1179.      GOSUB 12993
  1180.      CALL UPDTCALR ("Left comment",1)
  1181.      REDIM A$(ADIM)
  1182.      RETURN
  1183. '
  1184. ' *****************************************************************************
  1185. ' *  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)                       *
  1186. ' *****************************************************************************
  1187. '
  1188. 1900 CALL OPENMSG
  1189.      IF EC = 64 THEN _
  1190.         EC = 0 : _
  1191.         GOTO 5360
  1192.      FIELD 1, 128 AS MESSAGE.RECORD$
  1193.      SHOW.ACTIVE = FALSE
  1194.      IF NOT PRIVATE.DOOR THEN _
  1195.         A$ = "Checking messages in "+GRN$ : _
  1196.         GOSUB 12978 : _
  1197.         SHOW.ACTIVE = TRUE
  1198.      MESSAGES.FROM.USER = FALSE
  1199.      ACTIVE.MESSAGES = 0
  1200.      GOSUB 23000
  1201.      MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  1202.      ACTIVE.DELAY! = 0
  1203.      MAXIMUM.MESSAGES = VAL(MID$(MESSAGE.RECORD$,89,7))
  1204.      IF MAXIMUM.MESSAGES > MM THEN _
  1205.         MAXIMUM.MESSAGES = MM
  1206.      REDIM M(MAXIMUM.MESSAGES,2)
  1207. 1905 GET 1,MESSAGE.RECORD
  1208.      NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,117,4))
  1209.      IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  1210.         NUMBER.RECORDS.IN.MESSAGE = 1
  1211. 1906 CALL FINDTIME (TI!)
  1212.      IF SHOW.ACTIVE AND TI! > ACTIVE.DELAY! THEN _
  1213.         A$ = "." : _
  1214.         GOSUB 12978 : _
  1215.         CALL FINDTIME (TI!) : _
  1216.         ACTIVE.DELAY! = TI! + 1
  1217. 1910 IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  1218.         LOW.MESSAGE.NUMBER = M(1,2) : _
  1219.         GOTO 1950
  1220. 1915 IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ OR _
  1221.         MID$(MESSAGE.RECORD$,116,1) <> ACTIVE.MESSAGE$ THEN _
  1222.         GOTO 1946
  1223. 1920 IF INSTR(MID$(MESSAGE.RECORD$,37,31),ACTIVE.USER.NAME$) OR _
  1224.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,37,31),"SYSOP")) OR _
  1225.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,37,31),SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1226.         GOTO 1925
  1227.      GOTO 1935
  1228. 1925 IF SHOW.ACTIVE THEN _
  1229.         CALL SKIPLINE (1) : _
  1230.         CALL QTPUT("Mail for YOU (* = Private)",1) : _
  1231.         SHOW.ACTIVE = FALSE
  1232. 1930 A$ = LEFT$(MESSAGE.RECORD$,5)
  1233.      GOSUB 12978
  1234. 1935 IF INSTR(MID$(MESSAGE.RECORD$,6,31),ACTIVE.USER.NAME$) OR _
  1235.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),"SYSOP")) OR _
  1236.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1237.         GOTO 1940
  1238.      GOTO 1945
  1239. 1940 IF MESSAGES.FROM.USER < ADIM THEN _
  1240.         MESSAGES.FROM.USER = MESSAGES.FROM.USER + 1 : _
  1241.         B$(MESSAGES.FROM.USER) = LEFT$(MESSAGE.RECORD$,5)
  1242. 1945 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1243.      M(ACTIVE.MESSAGES,1) = MESSAGE.RECORD
  1244.      M(ACTIVE.MESSAGES,2) = VAL(MID$(MESSAGE.RECORD$,2,4))
  1245. 1946 MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE
  1246.      GOTO 1905
  1247. 1950 IF SHOW.ACTIVE THEN _
  1248.         A$ = "Sorry, " + FIRST.NAME$ + ", NO MAIL for you" :_
  1249.         GOSUB 12975
  1250.      IF MESSAGES.FROM.USER = 0 OR NOT MESSAGE.REMINDER THEN _
  1251.         RETURN
  1252.      IF PRIVATE.DOOR THEN _
  1253.         GOTO 1961
  1254.      A$ = "Mail you left"
  1255.      GOSUB 12976
  1256. 1960 FOR I = 1 TO MESSAGES.FROM.USER
  1257.        A$ = B$(I)
  1258.        GOSUB 12978
  1259.      NEXT
  1260.      CALL SKIPLINE (1)
  1261.      CALL QTPUT("Please <K>ill old/unneeded messages",1)
  1262. 1961 REDIM B$(ADIM)
  1263.      RETURN
  1264. '
  1265. ' *****************************************************************************
  1266. ' *  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)                               *
  1267. ' *****************************************************************************
  1268. '
  1269. 2000 IF LOW.MESSAGE.NUMBER > 0 AND _
  1270.         ACTIVE.MESSAGES = MAXIMUM.MESSAGES THEN _
  1271.         A$ = "No room for new messages!  Try tomorrow" : _
  1272.         GOSUB 12975 : _
  1273.         GOTO 3650
  1274. 2006 MESSAGE.PASSWORD$ = ""
  1275.      SYSOP.COMMENT = FALSE
  1276.      IF NOT REPLY THEN _
  1277.         MESSAGE.TO$ = ""
  1278. 2007 IF SYSOP.COMMENT THEN _
  1279.         Z$ = COMMENTS.FILE$ : _
  1280.         FT$ = "comment" _
  1281.      ELSE Z$ = ACTIVE.MESSAGE.FILE$ : _
  1282.           FT$ = "message"
  1283. 2008 IF SYSOP.COMMENT THEN _
  1284.         CALL FINDFREE : _
  1285.         GOTO 2009
  1286.      FREE.SPACE$ = "2000"
  1287.      IF NEXT.MESSAGE.RECORD + 3 >= HIGHEST.MESSAGE.RECORD THEN _
  1288.         FREE.SPACE$ = "1"
  1289. 2009 IF VAL(FREE.SPACE$) < 2000 THEN _
  1290.         A$ = "No room for " + FT$ : _
  1291.         GOSUB 12979 : _
  1292.         GOTO 3650
  1293. 2010 LINES.IN.MESSAGE = 0
  1294.      L = 0
  1295.      X = 0
  1296.      REDIM A$(ADIM)
  1297.      IF SYSOP.COMMENT THEN _
  1298.         GOTO 2100
  1299.      IF SYSOP.MESSAGE THEN _
  1300.         SYSOP.MESSAGE = FALSE : _
  1301.         GOTO 2077
  1302. 2020 IF REPLY THEN _
  1303.         GOTO 2060
  1304.      A$ = "To (Press [ENTER] for All)"
  1305.      CALL SKIPLINE (1)
  1306.      GOSUB 12995
  1307.      IF LEN(B$(1)) > 30 THEN _
  1308.         A$ = "30 Char. Max" : _
  1309.         GOSUB 12979 : _
  1310.         GOTO 2020
  1311. 2030 IF Q = 0 THEN _
  1312.         MESSAGE.TO$ = "ALL" _
  1313.      ELSE CALL ALLCAPSD (B$(),1) : _
  1314.           MESSAGE.TO$ = B$(1)
  1315. 2035 A$ = "Subject"
  1316.      GOSUB 12995
  1317.      IF LEN(B$(1)) > 25 THEN _
  1318.         A$ = "25 Char. Max" : _
  1319.         GOSUB 12979 : _
  1320.         GOTO 2035
  1321. 2045 IF Q = 0 THEN _
  1322.         RETURN 1200
  1323.      CALL ALLCAPSD (B$(),1)
  1324.      SUBJECT$ = B$(1)
  1325. 2060 A$ = "Security: [K]ill, P)assword, R)eceiver, N)one, H)elp"
  1326.      GOSUB 12995
  1327.      IF Q = 0 THEN _
  1328.         B$(1) = "K"
  1329.      Z$ = LEFT$(B$(1),1)
  1330.      CALL ALLCAPS (Z$)
  1331.      ON INSTR("RKNPH",Z$) GOTO 2075,2090,2100,2075,2070
  1332.      GOTO 2060
  1333. '
  1334. ' *****************************************************************************
  1335. ' *  DISPLAY MESSAGE PROTECT HELP                                             *
  1336. ' *****************************************************************************
  1337. '
  1338. 2070 FILE.NAME$ = HELP$(3)
  1339.      GOSUB 1790
  1340.      GOTO 2060
  1341. '
  1342. ' *****************************************************************************
  1343. ' *  MAKE MESSAGE READ PROTECTED (ONLY ADDRESSEE AND SYSOP CAN READ IT)       *
  1344. ' *****************************************************************************
  1345. '
  1346. 2075 IF MESSAGE.TO$ = "ALL" THEN _
  1347.         CALL QTPUT("Message to ALL cannot be Receiver protected",1) : _
  1348.         GOTO 2060
  1349.      IF Z$ = "P" THEN _
  1350.         GOTO 2088
  1351. 2077 IF (START.HASH <> 1 OR INSTR(MESSAGE.TO$,"SYSOP") OR _
  1352.         ACTIVE.USER.NAME$ = "SYSOP" OR _
  1353.         INSTR(MESSAGE.TO$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1354.         GOTO 2081
  1355. 2079 IF NOT REPLY AND START.HASH = 1 THEN _
  1356.         TEMP.HASH.VALUE$ = MESSAGE.TO$ : _
  1357.         FOUND = FALSE : _
  1358.         SUIX = USER.FILE.INDEX : _
  1359.         GOSUB 12600 : _
  1360.         USER.FILE.INDEX = SUIX : _
  1361.         GOSUB 12984 : _
  1362.         IF NOT FOUND THEN _
  1363.            A$ = MESSAGE.TO$ + " not active user" : _
  1364.            GOSUB 1397 : _
  1365.            GOTO 2020
  1366. 2081 A$ = "Sending personal mail to " + MESSAGE.TO$
  1367.      GOSUB 12979
  1368. 2084 MESSAGE.PASSWORD$ = "^READ^"
  1369.      GOTO 2100
  1370. 2085 A$ = "Password"
  1371.      GOSUB 12995
  1372.      IF Q = 0 THEN _
  1373.         GOTO 2085
  1374.      IF LEN(B$(1)) > L THEN _
  1375.         A$ = STR$(L) + " Chars. max" : _
  1376.         GOSUB 12979 : _
  1377.         GOTO 2085
  1378.      IF L = 15 AND MID$(B$(1),1,1) = "!" THEN _
  1379.         A$ = "Password can't begin with '!'" : _
  1380.         GOSUB 12979 : _
  1381.         GOTO 2085
  1382.      RETURN
  1383. '
  1384. ' *****************************************************************************
  1385. ' *  MAKE MESSAGE PASSWORD PROTECTED (USERS WITH PASSWORD AND SYSOP CAN READ) *
  1386. ' *****************************************************************************
  1387. '
  1388. 2088 A$ = "Receiver(s) Must KNOW PASSWORD TO READ msg.  Use password (Y/N)"
  1389.      GOSUB 12995
  1390.      IF NO THEN _
  1391.         GOTO 2070
  1392.      L = 14
  1393.      A1$ = "!"
  1394.      GOSUB 2085
  1395.      CALL ALLCAPSD (B$(),1)
  1396.      GOTO 2092
  1397. '
  1398. ' *****************************************************************************
  1399. ' *  MAKE MESSAGE KILL PROTECTED (ONLY SENDER, ADDRESSEE AND SYSOP CAN KILL)  *
  1400. ' *****************************************************************************
  1401. '
  1402. 2090 L = 15
  1403.      A1$ = ""
  1404.      B$(1) = "^KILL^"
  1405. 2092 MESSAGE.PASSWORD$ = A1$ + B$(1)
  1406. '
  1407. ' *****************************************************************************
  1408. ' *  ENTER MAIN BODY OF MESSAGE                                               *
  1409. ' *****************************************************************************
  1410. '
  1411. 2100 A$ = "Type " + _
  1412.           FT$ + _
  1413.           STR$(MAX.MESSAGE.LINES) + _
  1414.           " lines max" + PRESS.ENTER$
  1415.      GOSUB 12975
  1416.      GOSUB 3200
  1417. 2125 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1418.      A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + ": " + A$(LINES.IN.MESSAGE)
  1419.      GOSUB 12978
  1420.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN+1)
  1421.      IF WAIT.EXPIRED THEN _
  1422.         GOTO 10590_
  1423.      ELSE IF SUBROUTINE.PARAMETER = -1 THEN _
  1424.         GOTO 10595
  1425.      GOSUB 60000
  1426.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1427.         LINES.IN.MESSAGE = LINES.IN.MESSAGE-1 : _
  1428.         GOTO 2300
  1429. 2140 J = LINES.IN.MESSAGE
  1430.      GOSUB 2200
  1431.      IF X THEN _
  1432.         GOTO 2300
  1433.      GOTO 2125
  1434. 2200 X = 0
  1435.      IF J < (MAX.MESSAGE.LINES-2) THEN _
  1436.         RETURN
  1437.      A$ = MID$("2 lines leftLast line   Full",12*(J-(MAX.MESSAGE.LINES-2)) + 1,12)
  1438.      X = (J > (MAX.MESSAGE.LINES-1))
  1439. 2210 GOSUB 12979
  1440.      RETURN
  1441. '
  1442. ' *****************************************************************************
  1443. ' *  FINAL MESSAGE DISPOSITION                                                *
  1444. ' *****************************************************************************
  1445. '
  1446. 2300 GOSUB 12979
  1447.      IF NOT EXPERT.USER THEN _
  1448.         GOSUB 50400
  1449. 2315 A$ = "Edit Sub-function <A,C,D,E,I,L,M,S,?>"
  1450.      CALL SKIPLINE (1)
  1451.      GOSUB 12995
  1452.      IF Q = 0 THEN _
  1453.         GOTO 2315
  1454.      CALL ALLCAPSD (B$(),1)
  1455.      Z$ = B$(1)
  1456. 2325 IF Q > 1 AND Z$ <> "M" THEN _
  1457.         L = VAL(B$(Q)) : _
  1458.         GOSUB 3320
  1459. 2330 ON INSTR("ACDEILMS?",Z$) GOTO 2400,2340,2500,2600,2800,3000,3100,3400,2345
  1460.      GOTO 2300
  1461. '
  1462. ' *****************************************************************************
  1463. ' *  CONTINUE ENTERING MESSAGE                                                *
  1464. ' *****************************************************************************
  1465. '
  1466. 2340 GOSUB 3200
  1467.      GOTO 2140
  1468. '
  1469. ' *****************************************************************************
  1470. ' *  DISPLAY MESSAGE SUBCOMMANDS HELP FILE                                    *
  1471. ' *****************************************************************************
  1472. '
  1473. 2345 FILE.NAME$ = HELP$(4)
  1474.      GOSUB 1790
  1475.      GOTO 2315
  1476. '
  1477. ' *****************************************************************************
  1478. ' *  ABORT MESSAGE                                                            *
  1479. ' *****************************************************************************
  1480. '
  1481. 2400 A$ = "Abort " + FT$ + " (Y/N)"
  1482.      CALL SKIPLINE (1)
  1483.      GOSUB 12995
  1484.      IF NOT YES THEN _
  1485.         GOTO 2300
  1486. 2430 A$ = "Aborted"
  1487.      GOSUB 12975
  1488.      GOTO 3650
  1489. '
  1490. ' *****************************************************************************
  1491. ' *  DELETE MESSAGE LINE                                                      *
  1492. ' *****************************************************************************
  1493. '
  1494. 2500 GOSUB 12979
  1495.      IF Q = 1 THEN _
  1496.         A$ = "Delete " : _
  1497.         GOSUB 12978 : _
  1498.         GOSUB 3300
  1499. 2520 A$ = "Line #" + STR$(L)
  1500.      GOSUB 12979
  1501.      A$ = A$(L)
  1502.      GOSUB 12977
  1503.      A$ = "Delete this line (Y/N)"
  1504.      GOSUB 12995
  1505.      IF NOT YES THEN _
  1506.         A$ = "NOT Deleted" : _
  1507.         GOSUB 12979 : _
  1508.         GOTO 2300
  1509. 2550 LINES.IN.MESSAGE = LINES.IN.MESSAGE-1
  1510.      FOR X = L TO LINES.IN.MESSAGE
  1511.        A$(X) = A$(X + 1)
  1512.      NEXT
  1513.      A$(LINES.IN.MESSAGE + 1) = ""
  1514.      A$ = "Deleted Line #" + STR$(L)
  1515.      GOSUB 12979
  1516.      GOTO 2300
  1517. '
  1518. ' *****************************************************************************
  1519. ' *  EDIT MESSAGE LINE                                                        *
  1520. ' *****************************************************************************
  1521. '
  1522. 2600 GOSUB 12979
  1523.      IF Q = 1 THEN _
  1524.         GOSUB 3300
  1525. 2620 A$ = "Line #" + STR$(L) + " is:" + RETURN.LINE.FEED$ + A$(L)
  1526.      GOSUB 12977
  1527.      IF NOT EXPERT.USER THEN _
  1528.         CALL QTPUT ("Search & replace",1)
  1529.      A$ = "Search for ([ENTER] quits)"
  1530.      GOSUB 12995
  1531.      IF Q = 0 THEN _
  1532.         GOTO 2300
  1533.      X$ = B$(1)
  1534.      IF Q > 1 THEN _
  1535.         Y$ = B$(2): _
  1536.         GOTO 2660
  1537.      A$="And replace by"
  1538.      GOSUB 12995
  1539.      Y$ = B$(1)
  1540. 2660 X = INSTR(1,A$(L),X$)
  1541.      IF X = 0 THEN _
  1542.         GOTO 2710
  1543. 2670 FF = LEN(X$)
  1544.      JJ = LEN(Y$)
  1545.      IF FF = JJ THEN _
  1546.         MID$(A$(L),X) = Y$ : _
  1547.         GOTO 2620
  1548. 2690 DF$ = LEFT$(A$(L),X-1)
  1549.      A$(L) = DF$ + Y$ + MID$(A$(L),X + FF)
  1550.      GOTO 2620
  1551. 2710 A$ = "String <" + X$ + "> not found in line" + STR$(L)
  1552.      GOSUB 12979
  1553.      GOTO 2300
  1554. '
  1555. ' *****************************************************************************
  1556. ' *  INSERT MESSAGE LINE                                                      *
  1557. ' *****************************************************************************
  1558. '
  1559. 2800 IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES AND NOT SYSOP THEN _
  1560.         A$ = "Message full" : _
  1561.         GOSUB 12979 : _
  1562.         GOTO 2920
  1563. 2820 GOSUB 12979
  1564.      IF Q = 1 THEN _
  1565.         A$ = "Before " : _
  1566.         GOSUB 12978 : _
  1567.         GOSUB 3300
  1568. 2830 LL = LINES.IN.MESSAGE
  1569.      K = LINES.IN.MESSAGE-L
  1570.      FOR X = L TO LINES.IN.MESSAGE
  1571.        B$(X + 1-L) = A$(X)
  1572.        A$(X) = ""
  1573.      NEXT
  1574.      LINES.IN.MESSAGE = L
  1575. 2840 A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + ": "
  1576.      GOSUB 12978
  1577.      CALL LINEEDIT(LINES.IN.MESSAGE,RIGHT.MARGIN+1)
  1578.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1579.         GOTO 2920
  1580. 2870 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1581.      J = LINES.IN.MESSAGE + K-1
  1582.      GOSUB 2200
  1583.      IF NOT X THEN _
  1584.         GOTO 2840
  1585. 2920 FOR X = 1 TO K + 1
  1586.        A$(LINES.IN.MESSAGE + X-1) = B$(X)
  1587.      NEXT
  1588.      REDIM B$(ADIM)
  1589.      LINES.IN.MESSAGE = LL + LINES.IN.MESSAGE-L
  1590.      GOTO 2300
  1591. '
  1592. ' *****************************************************************************
  1593. ' *  LIST MESSAGE CONTENTS                                                    *
  1594. ' *****************************************************************************
  1595. '
  1596. 3000 STOP.INTERRUPTS = TRUE
  1597.      GOSUB 12979
  1598.      IF Q = 1 THEN _
  1599.         L = 1 : _
  1600.         A$ = "To: " + MESSAGE.TO$ + " Re: " + SUBJECT$ : _
  1601.         GOSUB 12979 : _
  1602.         GOSUB 3200
  1603. 3020 FOR X = L TO LINES.IN.MESSAGE
  1604.        IF RET THEN _
  1605.           GOTO 2300 _
  1606.        ELSE A$ = RIGHT$(STR$(X),2) + ": " + A$(X)
  1607. 3030   GOSUB 12979
  1608.      NEXT
  1609.      GOTO 2300
  1610. '
  1611. ' *****************************************************************************
  1612. ' *  CHANGE MARGIN WIDTH                                                      *
  1613. ' *****************************************************************************
  1614. '
  1615. 3100 GOSUB 12979
  1616.      IF Q <> 1 THEN _
  1617.         B$(1) = B$(Q) : _
  1618.         GOTO 3130
  1619. 3115 A$ = "SET Right-Margin from" + STR$(RIGHT.MARGIN) + " TO (8...72)"
  1620.      GOSUB 12995
  1621.      IF LEN(B$(1)) > 2 THEN _
  1622.         GOTO 3140
  1623. 3130 X = VAL(B$(1))
  1624.      IF X > 7 AND X < 73 THEN _
  1625.         RIGHT.MARGIN = X : _
  1626.         A$ = "Margin now" + STR$(RIGHT.MARGIN) : _
  1627.         GOTO 3150
  1628. 3140 A$ = "Invalid - Margin UNCHANGED"
  1629. 3150 GOSUB 12979
  1630.      IF UTILITY.MARGIN.CHANGE THEN _
  1631.         RETURN
  1632.      GOTO 2300
  1633. 3200 A$ = "    [" + STRING$(RIGHT.MARGIN-2,45) + "]"
  1634.      GOSUB 12975
  1635.      RETURN
  1636. 3300 A$ = "Line #"
  1637.      GOSUB 12995
  1638.      L = VAL(B$(1))
  1639. 3320 IF L >= 1 AND L <= LINES.IN.MESSAGE THEN _
  1640.         RETURN
  1641. 3330 IF Q = 0 THEN _
  1642.         RETURN 2300
  1643. 3340 A$ = "No such line"
  1644.      GOSUB 12979
  1645.      RETURN 2300
  1646. '
  1647. ' *****************************************************************************
  1648. ' *  SAVE MESSAGE                                                             *
  1649. ' *****************************************************************************
  1650. '
  1651. 3400 IF SYSOP.COMMENT THEN _
  1652.         GOTO 1850
  1653. 3405 GOSUB 4910
  1654.      MESSAGE.RECORD.SAVE$ = MESSAGE.RECORD$
  1655.      A$ = "Adding new msg #" + STR$(HIGH.MESSAGE.NUMBER + 1)
  1656.      IF NOT LOCAL.USER THEN _
  1657.         CALL UPDTCALR (A$,1)
  1658.      GOSUB 12978
  1659.      SL = 0
  1660.      N$ = ""
  1661.      IF LOW.MESSAGE.NUMBER = 0 THEN _
  1662.         LOW.MESSAGE.NUMBER = 1 : _
  1663.         HIGH.MESSAGE.NUMBER = 1 : _
  1664.         GOTO 3410
  1665.      HIGH.MESSAGE.NUMBER = HIGH.MESSAGE.NUMBER + 1
  1666. 3410 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1667.      MESSAGE.NUMBER$ = STR$(HIGH.MESSAGE.NUMBER) + _
  1668.                        SPACE$(5-LEN(STR$(HIGH.MESSAGE.NUMBER)))
  1669.      IF MESSAGE.PASSWORD$ = "^READ^" THEN _
  1670.         MID$(MESSAGE.NUMBER$,1,1) = "*"
  1671. 3460 MESSAGE.FROM$ = ACTIVE.USER.NAME$ + SPACE$(31-LEN(ACTIVE.USER.NAME$))
  1672.      MESSAGE.TO$ = MESSAGE.TO$ + SPACE$(31-LEN(MESSAGE.TO$))
  1673.      MID$(MESSAGE.TO$,23,8) = TIME$
  1674.      SUBJECT$ = SUBJECT$ + SPACE$(25-LEN(SUBJECT$))
  1675.      MESSAGE.PASSWORD$ = MESSAGE.PASSWORD$ + SPACE$(15-LEN(MESSAGE.PASSWORD$))
  1676.      FOR J = 1 TO LINES.IN.MESSAGE
  1677.        A$(J) = A$(J) + CHR$(227)
  1678.        SL = SL + LEN(A$(J))
  1679.      NEXT
  1680.      IF SL MOD 128 = 0 THEN _
  1681.         N$ = STR$(SL\128 + 1) _
  1682.      ELSE N$ = STR$(SL\128 + 2)
  1683. 3530 GET 1,NEXT.MESSAGE.RECORD
  1684.      M(ACTIVE.MESSAGES,1) = NEXT.MESSAGE.RECORD
  1685.      M(ACTIVE.MESSAGES,2) = HIGH.MESSAGE.NUMBER
  1686.      LSET MESSAGE.RECORD$ = MESSAGE.NUMBER$ + _
  1687.                             MESSAGE.FROM$ + _
  1688.                             MESSAGE.TO$ + _
  1689.                             CURRENT.DATE$ + _
  1690.                             SUBJECT$ + _
  1691.                             MESSAGE.PASSWORD$ + _
  1692.                             ACTIVE.MESSAGE$ + _
  1693.                             N$
  1694.      PUT 1,NEXT.MESSAGE.RECORD
  1695.      NEXT.MESSAGE.RECORD = NEXT.MESSAGE.RECORD + VAL(N$)
  1696.      N$ = ""
  1697.      FOR J = 1 TO LINES.IN.MESSAGE
  1698.        A$ = "."
  1699.        GOSUB 12978
  1700.        N$ = N$ + A$(J)
  1701.        IF LEN(N$) > 127 THEN _
  1702.           LSET MESSAGE.RECORD$ = N$ : _
  1703.           PUT 1 : _
  1704.           N$ = MID$(N$,129)
  1705. 3630 NEXT
  1706.      IF LEN(N$) > 0 THEN _
  1707.         LSET MESSAGE.RECORD$ = N$ : _
  1708.         PUT 1
  1709.      REDIM A$(ADIM)
  1710. 3640 GOSUB 12979
  1711.      LSET MESSAGE.RECORD$ = MESSAGE.RECORD.SAVE$
  1712.      GOSUB 24000
  1713.      GOSUB 12985
  1714. 3650 IF REPLY THEN _
  1715.         CALL OPENMSG : _
  1716.         IF EC = 64 THEN _
  1717.            EC = 0 : _
  1718.            GOTO 5360 : _
  1719.         ELSE FIELD 1, 128 AS MESSAGE.RECORD$ : _
  1720.         RETURN
  1721.      RETURN 1200
  1722. '
  1723. ' *****************************************************************************
  1724. ' *  K - COMMAND FROM MAIN MENU (KILL MESSAGE)                                *
  1725. ' *****************************************************************************
  1726. '
  1727. 3900 KILL.MESSAGE = FALSE
  1728.      GOSUB 12979
  1729.      IF Q <> 1 THEN _
  1730.         MESSAGE.TO.KILL = VAL(B$(Q)) : _
  1731.         GOTO 3950
  1732. 3930 A$ = "Msg # to Kill"
  1733.      GOSUB 12995
  1734.      IF Q = 0 THEN _
  1735.         RETURN
  1736.      MESSAGE.TO.KILL = VAL(B$(Q))
  1737.      GOSUB 12979
  1738. 3950 CALL OPENMSG
  1739.      IF EC = 64 THEN _
  1740.         EC = 0 : _
  1741.      FIELD 1, 128 AS MESSAGE.RECORD$
  1742.      CALL KILLMSG (MESSAGE.TO.KILL,ACTIVE.MESSAGES)
  1743. 4040 IF KILL.MESSAGE THEN _
  1744.         RETURN
  1745.      RETURN 1200
  1746. '
  1747. ' *****************************************************************************
  1748. ' *  L - COMMAND FROM UTILITY MENU (LINE FEEDS TOGGLE)                        *
  1749. ' *****************************************************************************
  1750. '
  1751. 4100 LINE.FEEDS = NOT LINE.FEEDS
  1752.      IF LOCAL.USER THEN _
  1753.         LINE.FEEDS = TRUE
  1754.      A$ = "Line Feeds " + MID$("OffOn",1-3*LINE.FEEDS,3)
  1755.      CALL SETCRLF
  1756.      GOSUB 12979
  1757.      RETURN
  1758. '
  1759. ' ***************************************************************
  1760. ' *     TOGGLE WHETHER BULLETINS SKIPPED ON LOGON IF NONE NEW   *
  1761. ' ***************************************************************
  1762. '
  1763. 4120 CHECK.BULLETIN.LOGON = NOT CHECK.BULLETIN.LOGON
  1764.      A$ = MID$("SKIP CHECK",1-5*CHECK.BULLETIN.LOGON,5) + _
  1765.           " old BULLETINS in logon"
  1766.      GOSUB 12979
  1767.      RETURN
  1768. '
  1769. ' ***************************************************************
  1770. ' *     TOGGLE WHETHER SKIP NEW FILE DOWNLOAD ON LOGON          *
  1771. ' ***************************************************************
  1772. '
  1773. 4140 SKIP.FILES.LOGON = NOT SKIP.FILES.LOGON
  1774.      A$ = MID$("CHECKSKIP ",1-5*SKIP.FILES.LOGON,5) + _
  1775.           " new files in logon"
  1776.      GOSUB 12979
  1777.      RETURN
  1778. 4200 PROMPT.BELL = NOT PROMPT.BELL
  1779.      A$ = "Prompt Bell " + MID$("OffOn",1-3*PROMPT.BELL,3)
  1780.      GOSUB 12979
  1781.      RETURN
  1782. '
  1783. ' *****************************************************************************
  1784. ' *  X - COMMAND EXPERT TOGGLE (GLOBAL)                                       *
  1785. ' *****************************************************************************
  1786. '
  1787. 4240 EXPERT.USER = NOT EXPERT.USER
  1788.      A$ = MID$("NoviceExpert",1-6*EXPERT.USER,6)
  1789.      GOSUB 12979
  1790.      RETURN
  1791. '
  1792. ' *****************************************************************************
  1793. ' *  T)opic - QUICK SCAN MESSAGES                                             *
  1794. ' *****************************************************************************
  1795. '
  1796. 4320 QUICK.SCAN.MESSAGES = TRUE
  1797.      READ.MESSAGES = FALSE
  1798.      SCAN.MESSAGES = FALSE
  1799.      GOTO 4350
  1800. '
  1801. ' *****************************************************************************
  1802. ' *  R - COMMAND FROM MAIN MENU (READ MESSAGES)                               *
  1803. ' *****************************************************************************
  1804. '
  1805. 4330 QUICK.SCAN.MESSAGES = FALSE
  1806.      READ.MESSAGES = TRUE
  1807.      SCAN.MESSAGES = FALSE
  1808.      IF NOT LOCAL.USER THEN _
  1809.         CALL UPDTCALR ("Read Messages...",1)
  1810.      GOSUB 1300
  1811.      GOTO 4350
  1812. '
  1813. ' *****************************************************************************
  1814. ' *  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)                        *
  1815. ' *****************************************************************************
  1816. '
  1817. 4340 IF Q < 2 THEN _
  1818.         GOSUB 1300
  1819. 4345 QUICK.SCAN.MESSAGES = FALSE
  1820.      READ.MESSAGES = FALSE
  1821.      SCAN.MESSAGES = TRUE
  1822. '
  1823. ' *****************************************************************************
  1824. ' *  MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN) ALL USE THIS ROUTINE     *
  1825. ' *****************************************************************************
  1826. '
  1827. 4350 CALL OPENMSG
  1828.      IF EC = 64 THEN _
  1829.         EC = 0 : _
  1830.         GOTO 5360
  1831.      FIELD 1,128 AS MESSAGE.RECORD$
  1832.      IF Q > 2 AND INSTR(B$(Q),"*") THEN _
  1833.         Z$ = "" : _
  1834.         GOTO 4360
  1835.      IF Q > 2 AND VAL(B$(Q)) = 0 THEN _
  1836.         Z$ = B$(Q) : _
  1837.         CALL ALLCAPS (Z$) : _
  1838.         Q = Q-1 _
  1839.      ELSE Z$ = ""
  1840. 4360 LG$(11) = Z$
  1841.      MESSAGES.SELECTED.INDEX = 1
  1842.      NUMBER.MESSAGES.SELECTED = Q
  1843.      ADDRESSED.TO.USER = FALSE
  1844.      NON.STOP = (PAGE.LENGTH < 1)
  1845. 4370 MESSAGES.SELECTED.INDEX = MESSAGES.SELECTED.INDEX  + 1
  1846. 4371 IF MESSAGES.SELECTED.INDEX <= NUMBER.MESSAGES.SELECTED THEN _
  1847.         CURRENT.MESSAGE = VAL(B$(MESSAGES.SELECTED.INDEX)) : _
  1848.         GOTO 4415
  1849. 4380 NON.STOP = FALSE
  1850.      ADDRESSED.TO.USER = FALSE
  1851.      A$ = "Msg # (" + _
  1852.            STR$(LOW.MESSAGE.NUMBER) + _
  1853.            " to" + _
  1854.            STR$(M(ACTIVE.MESSAGES,2)) + _
  1855.            ", *, <H>elp)"
  1856.      IF EXPERT.USER THEN _
  1857.         GOTO 4400
  1858. 4390 IF READ.MESSAGES THEN _
  1859.         A$ = A$ + " to Retrieve"+PRESS.ENTER$ _
  1860.      ELSE A$ = "Starting at " + A$
  1861. 4400 GOSUB 12995
  1862.      IF Q = 0 THEN _
  1863.         RETURN
  1864.      IF INSTR("Hh",LEFT$(B$(1),1)) THEN _
  1865.         FILE.NAME$ = HELP$(7) : _
  1866.         GOSUB 1790 : _
  1867.         RETURN
  1868.      MESSAGES.SELECTED.INDEX = 0
  1869.      NUMBER.MESSAGES.SELECTED = Q
  1870.      GOTO 4370
  1871. 4415 FORWARD = FALSE
  1872.      REVERSE = FALSE
  1873.      IF B$(MESSAGES.SELECTED.INDEX) = "*" THEN _
  1874.         CURRENT.MESSAGE = LAST.MESSAGE.READ + 1 : _
  1875.         FORWARD = TRUE : _
  1876.         GOTO 4430
  1877. 4416 IF INSTR("Mm",B$(MESSAGES.SELECTED.INDEX)) THEN _
  1878.         ADDRESSED.TO.USER = TRUE : _
  1879.         GOTO 4370
  1880.      IF CURRENT.MESSAGE = 0 THEN _
  1881.         RETURN
  1882.      GOSUB 12979
  1883. 4430 IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "+" THEN _
  1884.         FORWARD = TRUE
  1885.      IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "-" THEN _
  1886.         REVERSE = TRUE : _
  1887.         GOTO 4490
  1888. 4450 MESSAGE.DIM.INDEX = 1
  1889. 4452 IF MESSAGE.DIM.INDEX > ACTIVE.MESSAGES THEN _
  1890.         GOTO 4515
  1891.      IF READ.MESSAGES AND _
  1892.         M(MESSAGE.DIM.INDEX,2) = CURRENT.MESSAGE THEN _
  1893.         GOTO 4520
  1894. 4470 IF ((READ.MESSAGES AND FORWARD) OR _
  1895.         QUICK.SCAN.MESSAGES OR SCAN.MESSAGES) AND _
  1896.         M(MESSAGE.DIM.INDEX,2)  >= CURRENT.MESSAGE THEN _
  1897.         GOTO 4520
  1898. 4480 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + 1
  1899.      GOTO 4452
  1900. 4490 MESSAGE.DIM.INDEX = ACTIVE.MESSAGES
  1901. 4492 IF MESSAGE.DIM.INDEX < 1 THEN _
  1902.         GOTO 4515
  1903.      IF M(MESSAGE.DIM.INDEX,2) <= CURRENT.MESSAGE THEN _
  1904.         GOTO 4540
  1905. 4510 MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX - 1
  1906.      GOTO 4492
  1907. 4515 A$ = "No such msg #" + STR$(CURRENT.MESSAGE)
  1908.      GOSUB 12979
  1909.      GOTO 4370
  1910. 4520 ENDING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  1911.      IF READ.MESSAGES AND NOT FORWARD THEN _
  1912.         GOTO 4560
  1913. 4530 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  1914.      ENDING.MESSAGE.INDEX = ACTIVE.MESSAGES
  1915.      SO = 1
  1916.      GOTO 4550
  1917. 4540 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  1918.      ENDING.MESSAGE.INDEX = 1
  1919.      SO = -1
  1920. 4550 XXX = ENDING.MESSAGE.INDEX + SO
  1921.      MESSAGE.DIM.INDEX = STARTING.MESSAGE.INDEX
  1922. 4552 IF MESSAGE.DIM.INDEX = XXX THEN _
  1923.         GOTO 4637
  1924. 4560   GET 1,M(MESSAGE.DIM.INDEX,1)
  1925.        PASSWORD.FAILED = 0
  1926.        UH = 0
  1927.        Z$ = MID$(MESSAGE.RECORD$,101,15)
  1928.        X = 1
  1929. 4561   FF = INSTR(MID$(MESSAGE.RECORD$,X),ACTIVE.USER.NAME$)
  1930.        IF FF > 0 THEN _
  1931.           X = LEN(ACTIVE.USER.NAME$) + FF : _
  1932.           IF (FF < 7 OR MID$(MESSAGE.RECORD$,FF-1,1) = " ") AND (X > 66 OR MID$(MESSAGE.RECORD$,X,1) = " ") THEN _
  1933.              UH = TRUE _
  1934.           ELSE IF FF < 37 THEN _
  1935.                   X = 37 : _
  1936.                   GOTO 4561
  1937. 4562   IF NOT SYSOP THEN _
  1938.           IF INSTR(MESSAGE.RECORD$,"^READ^") > 0 AND NOT UH THEN _
  1939.              PASSWORD.FAILED = TRUE : _
  1940.              IF FORWARD OR REVERSE THEN _
  1941.                 GOTO 4635
  1942. 4563   CURRENT.MESSAGE = VAL(MID$(MESSAGE.RECORD$,2,4))
  1943.        IF ADDRESSED.TO.USER AND NOT UH THEN _
  1944.           GOTO 4625
  1945. 4580   IF INSTR(MESSAGE.RECORD$,LG$(11)) = 0 THEN _
  1946.           GOTO 4635
  1947. 4581   IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ THEN _
  1948.           GOTO 4630
  1949. 4582   PG = FALSE
  1950.        IF MID$(Z$,1,1) = "!" THEN _
  1951.           IF NOT SYSOP THEN _
  1952.              PG = TRUE : _
  1953.              PASSWORD.SAVE$ = MID$(Z$,2) + " " : _
  1954.              ATTEMPTS.ALLOWED = 0 : _
  1955.              GOSUB 665
  1956. 4584   IF PASSWORD.FAILED AND _
  1957.           (QUICK.SCAN.MESSAGES OR (SCAN.MESSAGES AND NOT PG)) THEN _
  1958.           GOTO 4635
  1959. 4585   IF PASSWORD.FAILED THEN _
  1960.           IF PG THEN _
  1961.              SJ$ = "<PASSWORD>" _
  1962.           ELSE SJ$ = "<PROTECTED>" _
  1963.        ELSE SJ$ = MID$(MESSAGE.RECORD$,76,25)
  1964. 4590   IF QUICK.SCAN.MESSAGES THEN _
  1965.           A$ = LEFT$(MESSAGE.RECORD$,5) : _
  1966.           A$ = LEFT$(A$ + SPACE$(2),INSTR(A$ +SPACE$(2),SPACE$(2))-1) : _
  1967.           A$ = A$ + " " + SJ$ : _
  1968.           GOSUB 12979 : _
  1969.           GOTO 4630
  1970. 4600   GOSUB 8000
  1971.        IF SCAN.MESSAGES OR RET THEN _
  1972.           GOTO 4630
  1973.        IF M(MESSAGE.DIM.INDEX,2) > LAST.MESSAGE.READ THEN _
  1974.           LAST.MESSAGE.READ = M(MESSAGE.DIM.INDEX,2)
  1975. 4610   IF NOT PASSWORD.FAILED THEN _
  1976.           GOTO 4613
  1977.        IF PG THEN _
  1978.           ATTEMPTS.ALLOWED = 2 : _
  1979.           GOSUB 667
  1980. 4611   IF PASSWORD.FAILED THEN _
  1981.           GOTO 4625
  1982. 4613   GOSUB 9000
  1983.        CALL SKIPLINE (1)
  1984. 4614   GOSUB 41000
  1985.        KILL.MESSAGE = FALSE
  1986.        REPLY = FALSE
  1987.        IF NON.STOP THEN _
  1988.           GOTO 4625
  1989. 4616   IF EXPERT.USER THEN _
  1990.          A$ = "More [Y],N,NS,RE" + MID$(",K",1,-UH*2)_
  1991.        ELSE A$ = "MORE [Y]es,N)o,NS)non-stop,RE)ply" + _
  1992.             MID$(",K)ill",1,-UH*7)
  1993.        NO.ADVANCE = TRUE
  1994.        GOSUB 12995
  1995.        CALL WIPELINE (43)
  1996.        IF NO THEN _
  1997.           GOTO 4650
  1998. '
  1999. ' *****************************************************************************
  2000. ' *  KILL CURRENT MESSAGE                                                     *
  2001. ' *****************************************************************************
  2002. '
  2003. 4618   IF KILL.MESSAGE AND (UH OR SYSOP) THEN _
  2004.           IF USER.SECURITY.LEVEL >= OPT.SEC(9) THEN _
  2005.              GOSUB 62520 : _
  2006.              MESSAGE.TO.KILL = CURRENT.MESSAGE : _
  2007.              GOSUB 3950 : _
  2008.              GOSUB 62530 : _
  2009.              GOTO 4625 _
  2010.           ELSE VIOLATION$ = "MORE KILL" : _
  2011.                GOSUB 1380 : _
  2012.                GOTO 4625
  2013. '
  2014. ' *****************************************************************************
  2015. ' *  REPLY TO CURRENT MESSAGE                                                 *
  2016. ' *****************************************************************************
  2017. '
  2018. 4620   IF NOT REPLY THEN _
  2019.           GOTO 4625
  2020. 4621   IF USER.SECURITY.LEVEL < OPT.SEC(5) THEN _
  2021.           VIOLATION$ = "MORE RE" : _
  2022.           GOSUB 1380 : _
  2023.           REPLY = FALSE : _
  2024.           GOTO 4625
  2025.        IF LEFT$(SUBJECT$,3) <> "(R)" THEN _
  2026.           SUBJECT$ = "(R)" + LEFT$(SUBJECT$,22)
  2027. 4622   MESSAGE.TO$ = MESSAGE.FROM$
  2028.        MESSAGE.FROM$ = ACTIVE.USER.NAME$
  2029.        GOSUB 62520
  2030.        GOSUB 2000
  2031.        REPLY = FALSE
  2032.        GOSUB 62530
  2033.        GOTO 4560
  2034. 4625   IF NOT FORWARD AND NOT REVERSE THEN _
  2035.           GOTO 4370
  2036. 4630   GOSUB 57110
  2037. 4631   CALL CARRIER
  2038.        IF SUBROUTINE.PARAMETER THEN _
  2039.           RETURN 10595
  2040.        IF RET THEN _
  2041.           RETURN
  2042. 4635 IF SO = 0 THEN _
  2043.         SO = 1
  2044.      MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX + SO
  2045.      GOTO 4552
  2046. 4637 IF READ.MESSAGES THEN _
  2047.         GOTO 4370
  2048. 4650 GOSUB 12979
  2049.      CALL QTPUT ("End of Messages",1)
  2050.      RETURN
  2051. '
  2052. ' *****************************************************************************
  2053. ' *  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)                               *
  2054. ' *****************************************************************************
  2055. '
  2056. 4700 IF NOT SYSOP.AVAILABLE THEN _
  2057.         GOTO 4708
  2058. 4705 CALL QTPUT ("Chat. Remote Conversation",1)
  2059.      JJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
  2060.      IF (JJ > START.OFFICE.HOURS AND JJ < END.OFFICE.HOURS) OR SYSOP.ANNOY THEN _
  2061.         GOTO 4710
  2062. 4707 GOTO 4750
  2063. 4708 A$ = "SYSOP in from" + _
  2064.           STR$(START.OFFICE.HOURS) + _
  2065.           " to" + _
  2066.           STR$(END.OFFICE.HOURS) + ","
  2067.      GOSUB 12979
  2068.      GOTO 4755
  2069. 4710 A$ = "Page " + SYSOP.FIRST.NAME$ + " ([Y]/N)"
  2070.      CALL SKIPLINE (1)
  2071.      GOSUB 12995
  2072.      IF NO THEN _
  2073.         RETURN
  2074.      PAGE.COUNT = 0
  2075.      A$ = "Paging " + SYSOP.FIRST.NAME$ + " now"
  2076.      GOSUB 12978
  2077.      CALL FINDTIME (PAGE.TIME.MAX!)
  2078.      PAGE.TIME.MAX! = PAGE.TIME.MAX! + 30
  2079. 4730 CALL DELAYIT (1)
  2080. 4735 PAGE.COUNT = PAGE.COUNT + 1
  2081.      IF INKEY$ = ESCAPE$ THEN _
  2082.         GOTO 4765
  2083. 4740 IF PAGE.COUNT MOD 2 THEN _
  2084.         A$ = PAGING.PRINTER.SUPPORT$ + CHR$(7) : _
  2085.         IF LEN(PAGING.PRINTER.SUPPORT$) = 3 AND PRINTER THEN _
  2086.            LPRINT CHR$(7);
  2087. 4745 GOSUB 12978
  2088.      CALL FINDTIME (TI!)
  2089.      IF TI! < PAGE.TIME.MAX! THEN _
  2090.         GOTO 4730
  2091.      GOSUB 12979
  2092. 4750 CALL QTPUT(SYSOP.FIRST.NAME$ + " not responding",1)
  2093. 4755 CALL QTPUT ("Try a message or comment",1)
  2094.      CALL UPDTCALR ("Operator paged " + LEFT$(TIME$,5),2)
  2095.      RETURN
  2096. 4765 CALL UPDTCALR ("Paged & chatted with Sysop",1)
  2097.      CALL QTPUT ("SYSOP in!  " + _
  2098.           FIRST.NAME$ + _
  2099.           ", this is " + _
  2100.           SYSOP.FIRST.NAME$ + _
  2101.           " go ahead!",1)
  2102. 4770 CM = TRUE
  2103.      CALL FINDTIME (TIME.CHAT.STARTED!)
  2104.      SUBROUTINE.PARAMETER = 1
  2105.      CALL LINE25
  2106.      A$(2) = ""
  2107. 4775 CALL LINEEDIT (1,72)
  2108.      IF FUNCTION.KEY <> 0 THEN _
  2109.        GOSUB 60010 : _
  2110.        A$(2) = A$(1) _
  2111.      ELSE IF KEY.PRESSED$ = ESCAPE$ OR SUBROUTINE.PARAMETER = -1 THEN _
  2112.         GOTO 4777
  2113.      A$(1) = ""
  2114.      IF A$(2) <> "" THEN_
  2115.        A$ = A$(2) : _
  2116.        A$(1) = A$(2) : _
  2117.        A$(2) = "" _
  2118.      ELSE _
  2119.        A$ = ""
  2120.      GOSUB 12978
  2121.      GOTO 4775
  2122. 4777 CM = 0
  2123.      CALL FINDTIME (TI!)
  2124.      ELAPSED! = FIX(TI! - TIME.CHAT.STARTED!)
  2125.      IF ELASPED! < 0 THEN _
  2126.         ELASPED! = TI! + (86400! - TIME.CHAT.STARTED!)
  2127.      SECONDS.PER.SESSION! = SECONDS.PER.SESSION! + ELAPSED!
  2128.      IF NOT LOCAL.USER THEN _
  2129.         AUTO.LOGOFF! = TI! + WAIT.BEFORE.DISCONNECT
  2130.      CALL QTPUT("Chat ended.  Returning to normal operation",2)
  2131.      RETURN 1205
  2132. '
  2133. ' *****************************************************************************
  2134. ' *  S - COMMAND FROM UTILITY MENU (STATISTICS)                               *
  2135. ' *****************************************************************************
  2136. '
  2137. 4850 A$ = "RBBS-PC " + VERSION.ID$ + " Node " + NODE.ID$
  2138.      GOSUB 12975
  2139.      IF NOT CONFERENCE.MODE THEN _
  2140.         A$ = "Caller # " + STR$(CALLS.TODATE!) + "  "
  2141. 4855 A$ = A$ + "# active msgs:" + STR$(ACTIVE.MESSAGES)
  2142.      A$ = A$ + "  Next msg #" + STR$(HIGH.MESSAGE.NUMBER + 1)
  2143.      LAST.MESSAGE.READ = -LAST.MESSAGE.READ * _
  2144.                          (LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  2145.      IF LAST.MESSAGE.READ > 0 THEN _
  2146.         A$ = A$ + "  Last msg read:" + STR$(LAST.MESSAGE.READ)
  2147. 4857 GOSUB 12976
  2148.      IF SYSOP THEN _
  2149.         USER.WORK = (HIGHEST.USER.RECORD * .95) + 1: _
  2150.         A$ = "USERS: used" + _
  2151.         STR$(CURRENT.USER.COUNT-1) + _
  2152.         " avl" + _
  2153.         STR$(USER.WORK - CURRENT.USER.COUNT) + _
  2154.         "  MSGS: used" + _
  2155.         STR$(ACTIVE.MESSAGES) + _
  2156.         " avl" + _
  2157.         STR$(MAXIMUM.MESSAGES-ACTIVE.MESSAGES) + _
  2158.         "  MSG REC: used" + _
  2159.         STR$(NEXT.MESSAGE.RECORD-1) + _
  2160.         " avl" + _
  2161.         STR$(HIGHEST.MESSAGE.RECORD + 1 + NODES.IN.SYSTEM - NEXT.MESSAGE.RECORD) : _
  2162.         GOSUB 12976
  2163. 4860 GOSUB 12979
  2164.      RETURN
  2165. 4900 CONFERENCE.MODE = TRUE
  2166.      IF NOT LOCAL.USER THEN _
  2167.         CALL UPDTCALR ("Entered " + GRN$,1)
  2168.      CALL QTPUT("Welcome to " + GRN$,1)
  2169. 4905 CALL FINDIT (FILE.NAME$)
  2170.      IF OK THEN _
  2171.         GOSUB 43030 : _
  2172.         GOSUB 6000
  2173. 4910 GOSUB 12986
  2174.      CALL OPENMSG
  2175.      IF EC = 64 THEN _
  2176.         EC = 0 : _
  2177.         GOTO 5360
  2178.      FIELD 1, 128 AS MESSAGE.RECORD$
  2179.      IF LOF(1) = 0 THEN _
  2180.         DF$ = ACTIVE.MESSAGE.FILE$ : _
  2181.         CLOSE 1 : _
  2182.         KILL ACTIVE.MESSAGE.FILE$ : _
  2183.         GOSUB 12987 : _
  2184.         GOTO 13600
  2185.      GOSUB 23000
  2186.      RETURN
  2187. '
  2188. ' *****************************************************************************
  2189. ' *  REMOVE NON ALPHA CHARACTERS FROM STRING                                  *
  2190. ' *****************************************************************************
  2191. '
  2192. 5100 X$ = ""
  2193.      FOR Z = 1 TO LEN(Z$)
  2194.        IF ASC(MID$(Z$,Z,1)) < 32 OR ASC(MID$(Z$,Z,1)) > 90 THEN _
  2195.           GOTO 5105
  2196.        X$ = X$ + MID$(Z$,Z,1)
  2197. 5105 NEXT
  2198.      Z$ = X$
  2199.      RETURN
  2200. '
  2201. ' *****************************************************************************
  2202. ' *  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)                          *
  2203. ' *****************************************************************************
  2204. '
  2205. 5110 A$ = "Enter new password" + PRESS.ENTER$
  2206.      GOSUB 45010
  2207.      IF Q = 0 THEN _
  2208.         RETURN
  2209.      IF LEN(B$(1)) > 15 OR B$(1) = SPACE$(LEN(B$(1))) THEN _
  2210.         GOTO 5110
  2211.      CALL ALLCAPSD (B$(),1)
  2212.      Z$ = B$(1)
  2213. 5120 A$ = "Reenter new password"
  2214.      GOSUB 45010
  2215.      IF Q = 0 THEN _
  2216.         RETURN
  2217.      CALL ALLCAPSD (B$(),1)
  2218.      IF Z$ <> B$(1) THEN _
  2219.         A$ = "Passwords don't match!" : _
  2220.         GOSUB 12979 : _
  2221.         RETURN
  2222. 5125 IF MAXIMUM.PASSWORD.CHANGES AND _
  2223.         CHANGES.THIS.SESSION > _
  2224.         MAXIMUM.PASSWORD.CHANGES AND _
  2225.         NOT SYSOP THEN _
  2226.             A$ = "No changes permitted" : _
  2227.             GOSUB 12975 : _
  2228.             RETURN _
  2229.      ELSE PASSWORD.CHANGE.ALLOWED = TRUE : _
  2230.           GOSUB 5140 : _
  2231.           IF NOT FOUND THEN _
  2232.              GOTO 5129 _
  2233.           ELSE A$ = "Temporary change" : _
  2234.                GOSUB 12975 : _
  2235.                PASSWORD$ = TEMP.PASSWORD$ : _
  2236.                SECONDS.PER.SESSION! = TEMP.TIME.ALLOWED * 60 : _
  2237.                USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL : _
  2238.                GOSUB 41070 : _
  2239.                SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL) : _
  2240.                CALL CALLOPT
  2241.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2242.         B$(1) = "********"
  2243. 5126 CALL UPDTCALR ("Used temp password " + B$(1),2)
  2244.      RETURN
  2245. 5129 GOSUB 12989
  2246.      CALL OPENUSER
  2247.      GOSUB 9450
  2248. 5130 GET 5,USER.FILE.INDEX
  2249.      CALL ALLCAPSD (B$(),1)
  2250.      LSET PASSWORD$ = B$(1)
  2251.      PUT 5,USER.FILE.INDEX
  2252.      CLOSE 5
  2253.      GOSUB 12991
  2254.      A$ = "Password changed"
  2255.      STOP.INTERRUPTS = FALSE
  2256.      GOSUB 12975
  2257.      IF MAXIMUM.PASSWORD.CHANGES THEN _
  2258.         CHANGES.THIS.SESSION = CHANGES.THIS.SESSION + 1
  2259. 5131 CALL UPDTCALR ("New Password " + B$(1),2)
  2260.      RETURN
  2261. '
  2262. ' *****************************************************************************
  2263. ' *  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS                          *
  2264. ' *****************************************************************************
  2265. '
  2266. 5135 IF USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL THEN _
  2267.         RETURN
  2268.      Z$ = ""
  2269.      Z = 0
  2270.      GOSUB 5140
  2271.      IF FOUND THEN _
  2272.         MINUTES.PER.SESSION! = TEMP.TIME.ALLOWED : _
  2273.         IF TEMP.REG.PERIOD > 0 THEN _
  2274.            DAYS.IN.SUBSCRIPTION.PERIOD = TEMP.REG.PERIOD
  2275.      RETURN
  2276. 5140 FOUND = FALSE
  2277.      CALL OPENWORK (PASSWORDS.FILE$)
  2278.      IF EC = 53 THEN _
  2279.          CALL UPDTCALR ("Missing file " + PASSWORDS.FILE$,2) : _
  2280.          IF Z = 1 THEN _
  2281.             CALL ALLCAPSD (B$(),1) : _
  2282.             Z$ = B$(1) : _
  2283.             GOTO 5160 _
  2284.          ELSE GOTO 5160
  2285.      Z$ = Z$ + SPACE$(15-LEN(Z$))
  2286. 5150 IF EOF(2) THEN _
  2287.         GOTO 5160
  2288. 5151 INPUT #2,TEMP.PASSWORD$,TEMP.SECURITY.LEVEL, _
  2289.               TEMP.TIME.ALLOWED,TEMP.REG.PERIOD
  2290.      IF LEN(TEMP.PASSWORD$) > 15 THEN _
  2291.         GOTO 5150
  2292.      TEMP.PASSWORD$ = TEMP.PASSWORD$ + SPACE$(15-LEN(TEMP.PASSWORD$))
  2293.      IF Z$ <> TEMP.PASSWORD$ THEN _
  2294.         GOTO 5150
  2295.      IF PASSWORD.CHANGE.ALLOWED AND _
  2296.         USER.SECURITY.LEVEL >= MINIMUM.SECURITY.FOR.TEMP.PASSWORD THEN _
  2297.         FOUND = TRUE _
  2298.      ELSE IF USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL THEN _
  2299.              FOUND = TRUE _
  2300.           ELSE GOTO 5150
  2301. 5160 RETURN
  2302. ' *****************************************************************************
  2303. ' *  COMPUTE THE NUMBER OF DAYS REMAINING UNTIL SUBSCRIPTION EXPIRES          *
  2304. ' *****************************************************************************
  2305. '
  2306. 5170 IF RESTRICT.BY.DATE THEN _
  2307.         CALL COMPDATE (USER.REG.YY,USER.REG.MM,USER.REG.DD,USER.COMPUTE.DATE!): _
  2308.         REG.DAYS.REMAINING = USER.COMPUTE.DATE! + _
  2309.                              DAYS.IN.SUBSCRIPTION.PERIOD - _
  2310.                              TODAY.COMPUTE.DATE! _
  2311.      ELSE REG.DAYS.REMAINING = 365
  2312.      RETURN
  2313. 5200 A$ = "CHANGE page length from" + _
  2314.           STR$(PAGE.LENGTH) + _
  2315.           " TO (0-255, 0=continuous)"
  2316.      GOSUB 12995
  2317.      IF Q = 0 THEN _
  2318.         CALL QTPUT ("No change",1):_
  2319.         RETURN
  2320. 5230 A = VAL(B$(Q))
  2321.      IF A < 0 OR A > 255 THEN _
  2322.         GOTO 5200
  2323.      PAGE.LENGTH = A
  2324.      CALL QTPUT ("Set to"+STR$(PAGE.LENGTH),1)
  2325.      RETURN
  2326. '
  2327. ' *****************************************************************************
  2328. ' *  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)                             *
  2329. ' *****************************************************************************
  2330. '
  2331. 5300 CALL FINDIT (CONFERENCE.MENU$)
  2332.      IF NOT OK THEN _
  2333.         A$ = "There are no Active Conferences available!" : _
  2334.         GOSUB 12976 : _
  2335.         GOTO 2210
  2336. 5310 IF Q > 1 THEN _
  2337.         B$(1) = B$(2) : _
  2338.         Q = 0 : _
  2339.         IF LEN(B$(2)) > 1 OR _
  2340.           (LEN(B$(2)) = 1 AND NOT INSTR("JLMQX",B$(2))) THEN _
  2341.            GOTO 5322 _
  2342.         ELSE GOTO 5317
  2343. 5312 IF EXPERT.USER THEN _
  2344.         GOTO 5315
  2345. 5313 FILE.NAME$ = CONFERENCE.MENU$
  2346.      GOSUB 43025
  2347. 5315 A$ = "Conference Function <J>oin,<L>ist,<M>ain,<Q>uit,<X>pert"
  2348.      GOSUB 12995
  2349.      IF Q = 0 THEN _
  2350.         GOSUB 12979 : _
  2351.         RETURN _
  2352.      ELSE Z$ = B$(1)
  2353. 5317 CALL ALLCAPSD (B$(),1)
  2354.      IF B$(1) = "X" THEN _
  2355.         GOSUB 4240 : _
  2356.         GOTO 5312
  2357.      FF = INSTR("JLMQ",B$(1))
  2358.      IF FF = 0 THEN _
  2359.         GOTO 5312
  2360.      ON FF GOTO 5320,5313,5350,2210
  2361. 5320 IF Q > 1 THEN _
  2362.         B$(1) = B$(2) : _
  2363.         GOTO 5322
  2364.      A$ = "Enter conference name"
  2365.      GOSUB 12995
  2366.      IF Q = 0 THEN _
  2367.         GOTO 5312
  2368. 5322 IF SYSOP OR LOCAL.USER THEN _
  2369.         GOSUB 5700
  2370. 5323 CALL ALLCAPSD (B$(),1)
  2371.      IF LEN(B$(1)) = 1 AND B$(1) = "M" THEN _
  2372.         GOTO 5350
  2373.      GRN$ = B$(1)
  2374.      Q = 0
  2375.      IF LEN(GRN$) > 7 THEN _
  2376.         EXPERT.USER = FALSE : _
  2377.         GOTO 5312
  2378.      Q = 0
  2379.      IF INSTR(GRN$,".") THEN _
  2380.         GOTO 5312
  2381.      CALL BADFILE (GRN$,BAD.FILE.NAME.INDEX)
  2382.      ON BAD.FILE.NAME.INDEX GOTO 5324,5350,5370
  2383. 5324 FILE.NAME$ = MID$(MAIN.MESSAGE.FILE$,1,2) + GRN$ + "M.DEF"
  2384.      CALL FINDIT (FILE.NAME$)
  2385.      IF NOT OK THEN _
  2386.     GOTO 5312
  2387. '
  2388. ' *****************************************************************************
  2389. ' * WHEN A CONFERENCE FILE IS FOUND, UPDATE THE PREVIOUS MESSAGE FILE CHECK-  *
  2390. ' * POINT RECORD                                                              *
  2391. ' *****************************************************************************
  2392. '
  2393.      GOSUB 12986
  2394.      CALL OPENMSG
  2395.      IF EC = 64 THEN _
  2396.         EC = 0 : _
  2397.         GOTO 5360
  2398.      FIELD 1, 128 AS MESSAGE.RECORD$
  2399.      GET 1,1
  2400.      MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)
  2401.      MID$(MESSAGE.RECORD$,62,5) = STR$(HIGHEST.USER.RECORD)
  2402.      PUT 1,1
  2403.      GOSUB 12987
  2404.      ACTIVE.MESSAGE.FILE$ = FILE.NAME$
  2405.      GOSUB 5343
  2406.      FILE.NAME$ = MID$(WELCOME.FILE$,1,2) + GRN$ + "W.DEF"
  2407. 5325 IF ACTIVE.USER.NAME$ = "SYSOP" OR _
  2408.         (CONFERENCE.MODE AND (ACTIVE.USER.FILE$ = MAIN.USER.FILE$)) THEN _
  2409.            GOTO 5327
  2410.      IF MAIN.USER.FILE.INDEX > 0 THEN _
  2411.         GOSUB 12988 : _
  2412.         CALL OPENUSER : _
  2413.         GOSUB 9450 : _
  2414.         GET 5,MAIN.USER.FILE.INDEX : _
  2415.         CALL DEFAULTU : _
  2416.         PUT 5,MAIN.USER.FILE.INDEX : _
  2417.         GOSUB 12990
  2418. 5327 ACTIVE.USER.FILE$ = MID$(ACTIVE.USER.FILE$,1,2) + GRN$ + "U.DEF"
  2419.      UPDATE.DATE = TRUE
  2420.      CALL FINDIT (ACTIVE.USER.FILE$)
  2421.      IF OK THEN _
  2422.         GOTO 5330
  2423.       ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  2424.       UPDATE.DATE = FALSE
  2425.       IF ACTIVE.USER.NAME$ <> "SYSOP" THEN _
  2426.          TIX = MAIN.USER.FILE.INDEX : _
  2427.          GOSUB 5382
  2428.       GOTO 5345
  2429. 5330 IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2430.         GOTO 5345
  2431.      GOSUB 12598
  2432.      GOSUB 12984
  2433. 5340 IF FOUND THEN _
  2434.         USER.FILE.INDEX = LOC(5) : _
  2435.         TIX = USER.FILE.INDEX : _
  2436.         GOSUB 9500 : _
  2437.         GOTO 5345
  2438.      A$ = "You are not in conference " + GRN$
  2439.      GOSUB 1397
  2440.      GRN$ = "MAIN"
  2441.      USER.FILE.INDEX = MAIN.USER.FILE.INDEX
  2442.      ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  2443.      GOSUB 5382
  2444.      ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  2445.      GOSUB 5343
  2446.      CONFERENCE.MODE = FALSE
  2447.      GOSUB 12979
  2448.      RETURN
  2449. '
  2450. ' *****************************************************************************
  2451. ' * WHEN A CONFERENCE FILE IS FOUND, UPDATE THE APPROPRIATE POINTERS FROM THE *
  2452. ' * NEW CONFERENCE                                                            *
  2453. ' *****************************************************************************
  2454. '
  2455. 5343 GOSUB 12986
  2456.      CALL OPENMSG
  2457.      IF EC = 64 THEN _
  2458.         EC = 0 : _
  2459.         GOTO 5360
  2460.      FIELD 1, 128 AS MESSAGE.RECORD$
  2461.      GOSUB 23000
  2462.      RETURN
  2463. 5345 GRN$ = GRN$ + " Conference"
  2464.      IF UPDATE.DATE AND ACTIVE.USER.NAME$ <> "SYSOP" THEN _
  2465.         LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  2466.                                   " " + _
  2467.                                   TIME.LOGGED.ON$ : _
  2468.         PUT 5,USER.FILE.INDEX : _
  2469.         GOSUB 12991
  2470. 5347 GOSUB 4900
  2471. 5348 GOSUB 12987
  2472.      RETURN 900
  2473. 5350 GRN$ = "MAIN"
  2474.      Q = 0
  2475.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2476.         GOSUB 5700 : _
  2477.         ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2478.         ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  2479.         CONFERENCE.MODE = FALSE : _
  2480.         GOSUB 12979 : _
  2481.         CALL OPENUSER : _
  2482.         GOSUB 9450 : _
  2483.         GOSUB 1900 : _
  2484.         RETURN 1200
  2485.      IF NOT LOCAL.USER THEN _
  2486.         CALL UPDTCALR ("Exited Conference",1)
  2487. 5360 IF CONFERENCE.MODE THEN _
  2488.         GOSUB 5380 : _
  2489.         ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  2490.         CONFERENCE.MODE = FALSE : _
  2491.         CALL OPENUSER : _
  2492.         GOSUB 9450 : _
  2493.         USER.FILE.INDEX = MAIN.USER.FILE.INDEX : _
  2494.         GET 5,USER.FILE.INDEX : _
  2495.         GOSUB 9500 : _
  2496.         GOSUB 1900
  2497.      GOSUB 12979
  2498.      IF COMMENTS.IN.CONFERENCE = 1 THEN _
  2499.         COMMENTS.IN.CONFERENCE = 0 : _
  2500.         RETURN
  2501.      RETURN 1200
  2502. 5370 GOSUB 1380
  2503.      GOTO 5312
  2504. '
  2505. ' *****************************************************************************
  2506. ' *    Update Users Record Whenever Leaves a Conference                       *
  2507. ' *****************************************************************************
  2508. 5380 IF TIX > 0 THEN _
  2509.         GOSUB 12989 : _
  2510.         CALL DEFAULTU : _
  2511.         PUT 5,TIX : _
  2512.         GOSUB 12991
  2513.      ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  2514.      IF ACTIVE.USER.FILE$ = MAIN.USER.FILE$ THEN _
  2515.         RETURN
  2516.      ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  2517.      USER.FILE.INDEX = MAIN.USER.FILE.INDEX
  2518. 5382 IF USER.FILE.INDEX < 1 THEN _
  2519.         USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL : _
  2520.         RETURN
  2521.      CALL OPENUSER
  2522.      GOSUB 9450
  2523.      GET 5,USER.FILE.INDEX
  2524.      GOSUB 9500
  2525.      RETURN
  2526. '
  2527. ' *****************************************************************************
  2528. ' *  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)                           *
  2529. ' *****************************************************************************
  2530. '
  2531. 5400 CALL SKIPLINE(2)
  2532.      CALL QTPUT ("Your PROFILE (utilities reset)",1)
  2533. 5410 EXPERT.USER = NOT EXPERT.USER
  2534.      GOSUB 4240
  2535.      GOSUB 43020
  2536.      FF = INSTR("AXCKYIGW",USER.TRANSFER.DEFAULT$)
  2537.      FF = FF-9*(FF < 1)
  2538.      GOSUB 42810
  2539.      UPPER.CASE = NOT UPPER.CASE
  2540.      GOSUB 42960
  2541.      LINE.FEEDS = NOT LINE.FEEDS
  2542.      GOSUB 4100
  2543.      GOSUB 42720
  2544.      PROMPT.BELL = NOT PROMPT.BELL
  2545.      GOSUB 4200
  2546.      CHECK.BULLETIN.LOGON = NOT CHECK.BULLETIN.LOGON
  2547.      GOSUB 4120
  2548.      SKIP.FILES.LOGON = NOT SKIP.FILES.LOGON
  2549.      GOSUB 4140
  2550.      AUTODOWNLOAD.AVAILABLE = NOT AUTODOWNLOAD.AVAILABLE
  2551.      GOSUB 1550
  2552.      RETURN
  2553. '
  2554. ' *****************************************************************************
  2555. ' *  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)                   *
  2556. ' *****************************************************************************
  2557. '
  2558. 5500 CALL BAUD450
  2559.      IF LOCAL.USER OR NOT (SUBROUTINE.PARAMETER OR C=20) THEN_
  2560.         RETURN
  2561. 5502 RETURN 10595  'Entry point when have double nested gosub
  2562. '
  2563. ' *****************************************************************************
  2564. ' *  PROVIDE (Y),N,NS MESSAGES FOR TEXT FILES LONGER THAN PAGE LENGTH         *
  2565. ' *****************************************************************************
  2566. '
  2567. 5600 GOSUB 41000
  2568.      CALL FINDTIME(AUTO.LOGOFF!)
  2569.      AUTO.LOGOFF! = AUTO.LOGOFF! + WAIT.BEFORE.DISCONNECT
  2570.      IF NON.STOP THEN _
  2571.         RETURN
  2572.      IF EXPERT.USER THEN _
  2573.         A$ = "More [Y],N,NS"_
  2574.      ELSE A$ = "MORE: [Y]es, N)o, NS)non-stop"
  2575.      NO.ADVANCE = TRUE
  2576.      GOSUB 12995
  2577.      CALL WIPELINE (33)
  2578.      RETURN
  2579. '
  2580. ' *****************************************************************************
  2581. ' *  SAVE SYSOP LAST MESSAGE READ POINTER                                     *
  2582. ' *****************************************************************************
  2583. '
  2584. 5700 GOSUB 12986
  2585.      CALL OPENMSG
  2586.      IF EC = 64 THEN _
  2587.         EC = 0 : _
  2588.         GOTO 5360
  2589.      FIELD 1, 128 AS MESSAGE.RECORD$
  2590.      GET 1,1
  2591.      MID$(MESSAGE.RECORD$,123,4) = "    "
  2592.      MID$(MESSAGE.RECORD$,123,4) = MID$(STR$(LAST.MESSAGE.READ),2)
  2593.      PUT 1,1
  2594.      GOSUB 12985
  2595.      RETURN
  2596. '
  2597. ' *****************************************************************************
  2598. ' *  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)                            *
  2599. ' *****************************************************************************
  2600. '
  2601. 5800 CALL QTPUT ("V)iew not implemented",1)
  2602.      RETURN
  2603. '
  2604. ' *****************************************************************************
  2605. ' *  DISPLAY TEXT FILES & SCAN DIRECTORIES                                    *
  2606. ' *****************************************************************************
  2607. '
  2608. 6000 IF STOP.INTERRUPTS THEN _
  2609.         A$ = "* <Ctrl K>/<Ctrl X> aborts <Ctrl S> suspends *" : _
  2610.         GOSUB 12976
  2611. 6020 CK = 0
  2612.      GOTO 7100
  2613. 6080 A$ = "Missing file " + FILE.NAME$ + ". Please tell SYSOP"
  2614.      GOSUB 12979
  2615.      RETURN
  2616. '
  2617. ' *****************************************************************************
  2618. ' *  SCAN DIRECTORIES (PRINT TEXT)                                            *
  2619. ' *****************************************************************************
  2620. '
  2621. 7000 A$ = "Scanning Directory " + _
  2622.           FILE.NAME.HOLD$ + _
  2623.           " for " + _
  2624.           A1$
  2625.      GOSUB 12979
  2626.      PG = TRUE
  2627. 7100 CALL OPENWORK (FILE.NAME$)
  2628.      IF EC = 53 THEN _
  2629.         CALL UPDTCALR ("Missing File " + FILE.NAME$,2) : _
  2630.         GOTO 6080
  2631. 7110 CALL CARRIER
  2632.      IF EOF(2) OR _
  2633.         (SUBROUTINE.PARAMETER AND NOT LOCAL.USER) THEN _
  2634.         GOTO 7260
  2635. 7130 LINE INPUT #2,A$
  2636.      IF CK = 0 THEN _
  2637.         GOTO 7250
  2638. 7157 IF CK > 1 THEN _
  2639.         Z$ = A$ : _
  2640.         CALL ALLCAPS (Z$) : _
  2641.         XXX = (INSTR(Z$,RS$) = 0) : _
  2642.         GOTO 7190
  2643. 7160 A = INSTR(9,MID$(A$,1,32),"/")
  2644.      IF A = 0 THEN _
  2645.         A = INSTR(9,MID$(A$,1,32),"-")
  2646. 7162 IF A < 3 THEN _
  2647.         GOTO 7110
  2648.      IF INSTR("0123456789",MID$(A$,A-1,1)) = 0 THEN _
  2649.         GOTO 7110
  2650.      A = A - 2
  2651.      WK$ = RIGHT$(MID$(A$,A,8),2) + _
  2652.            LEFT$(MID$(A$,A,8),2) + _
  2653.            MID$(MID$(A$,A,8),4,2)
  2654.      IF MID$(WK$,3,1) = " " THEN _
  2655.         MID$(WK$,3,1) = "0"
  2656.      IF MID$(WK$,5,1) = " " THEN _
  2657.         MID$(WK$,5,1) = "0"
  2658. 7189 XXX = (WK$ < RS$)
  2659. 7190 IF XXX THEN _
  2660.         GOTO 7110
  2661.      IF PG THEN _
  2662.         PG = FALSE : _
  2663.         CALL OPENWORK (FILE.NAME$) : _
  2664.         Q = 0 : _
  2665.         GOTO 7110
  2666. 7200 IF PG THEN _
  2667.         GOTO 7110
  2668. 7250 GOSUB 12979
  2669.      GOSUB 57110
  2670.      IF NOT RET THEN _
  2671.         GOTO 7110
  2672. 7260 Q = 0
  2673.      CLOSE 2
  2674.      CALL CARRIER
  2675.      IF SUBROUTINE.PARAMETER = -1 THEN _
  2676.         GOTO 10595
  2677.      RETURN
  2678. '
  2679. ' *****************************************************************************
  2680. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY                            *
  2681. ' *****************************************************************************
  2682. '
  2683. 8000 GOSUB 12979
  2684.      IF RET THEN _
  2685.         RETURN
  2686. 8020 IF MID$(MESSAGE.RECORD$,37,5) = "ALL  " THEN _
  2687.         MESSAGE.TO$ = "ALL" : _
  2688.         GOTO 8040
  2689. 8030 MESSAGE.TO$ = MID$(MESSAGE.RECORD$,37,22)
  2690.      MESSAGE.TO$ = LEFT$(MESSAGE.TO$ + SPACE$(2),INSTR(MESSAGE.TO$ +SPACE$(2),SPACE$(2))-1)
  2691. 8040 SUBJECT$ = MID$(MESSAGE.RECORD$,76,25)
  2692.      SUBJECT$ = LEFT$(SUBJECT$ + SPACE$(2),INSTR(SUBJECT$ +SPACE$(2),SPACE$(2))-1)
  2693.      IF PASSWORD.FAILED THEN _
  2694.         SUBJECT$ = SJ$
  2695. 8050 MESSAGE.FROM$ = MID$(MESSAGE.RECORD$,6,31)
  2696.      MESSAGE.FROM$ = LEFT$(MESSAGE.FROM$ + SPACE$(2),INSTR(MESSAGE.FROM$ +SPACE$(2),SPACE$(2))-1)
  2697.      A$ = "Msg # " + _
  2698.           LEFT$(MESSAGE.RECORD$,5) + _
  2699.           " Dated " + _
  2700.           MID$(MESSAGE.RECORD$,68,8) + _
  2701.           " " + _
  2702.           MID$(MESSAGE.RECORD$,59,8)
  2703.      IF NOT RET THEN _
  2704.         CALL QTPUT (A$,1): _
  2705.         CALL QTPUT (" From: " + MESSAGE.FROM$,1) : _
  2706.         CALL QTPUT ("   To: " + MESSAGE.TO$,1) : _
  2707.         A$ = "   Re: " + SUBJECT$
  2708.      IF NOT READ.MESSAGES THEN _
  2709.         GOTO 8080
  2710.      IF ADDRESSED.TO.USER THEN _
  2711.         GOTO 8076
  2712.      IF MESSAGE.TO$ = "ALL"  THEN _
  2713.         GOTO 8080
  2714.      IF NOT SYSOP THEN _
  2715.         GOTO 8080
  2716.      IF INSTR(MESSAGE.TO$,"SYSOP") > 0 OR _
  2717.         INSTR(MESSAGE.TO$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) > 0 THEN _
  2718.         GOTO 8076
  2719.      GOTO 8080
  2720. 8076 IF MID$(MESSAGE.RECORD$,123,6) = STRING$(6,0) OR _
  2721.         MID$(MESSAGE.RECORD$,123,6) = SPACE$(6) THEN _
  2722.         GOTO 8077
  2723.      YY$= RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,126,1))),2)+ ":" + _
  2724.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,127,1))),2)+ ":" + _
  2725.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,128,1))),2)
  2726.      FOR I = 1 TO 8
  2727.         IF MID$(YY$,I,1) = " " THEN _
  2728.            MID$(YY$,I,1) = "0"
  2729.      NEXT
  2730.      YY$ = YY$ + " on "
  2731.      YY$ = YY$ + _
  2732.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,123,1))),2)+ "/" + _
  2733.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,124,1))),2)+ "/" + _
  2734.           RIGHT$(STR$(ASC(MID$(MESSAGE.RECORD$,125,1))),2)
  2735.      FOR I = 13 TO 20
  2736.         IF MID$(YY$,I,1) = " " THEN _
  2737.            MID$(YY$,I,1) = "0"
  2738.      NEXT
  2739.      A$ = A$ + " Last read at " + YY$
  2740. 8077 YY$ = DATE$
  2741.      WK$ = TIME$
  2742.      MID$(MESSAGE.RECORD$,123,6) = CHR$(VAL(MID$(YY$,1,2))) + _
  2743.                                    CHR$(VAL(MID$(YY$,4,2))) + _
  2744.                                    CHR$(VAL(MID$(YY$,9,2))) + _
  2745.                                    CHR$(VAL(MID$(WK$,1,2))) + _
  2746.                                    CHR$(VAL(MID$(WK$,4,2))) + _
  2747.                                    CHR$(VAL(MID$(WK$,7,2)))
  2748.      GOSUB 12986
  2749.      PUT 1,M(MESSAGE.DIM.INDEX,1)
  2750.      GOSUB 12987
  2751. 8080 GOSUB 12979
  2752.      RETURN
  2753. '
  2754. ' *****************************************************************************
  2755. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY                                       *
  2756. ' *****************************************************************************
  2757. '
  2758. 9000 GOSUB 12979
  2759.      FOR X = 2 TO VAL(MID$(MESSAGE.RECORD$,117,4))
  2760.        GOSUB 12978
  2761.        EOL = FALSE
  2762.        J = 1
  2763.        GET 1
  2764. 9050   B = INSTR(J,MESSAGE.RECORD$,CHR$(227))
  2765.        IF RET THEN _
  2766.           RETURN
  2767. 9060   C = B-J
  2768.        IF C < 0 THEN _
  2769.           C = 128 : _
  2770.           EOL = TRUE
  2771. 9070   A$ = MID$(MESSAGE.RECORD$,J,C)
  2772.        IF EOL THEN _
  2773.           GOTO 9090
  2774. 9085   J = B + 1
  2775.        CALL QTPUT (A$,1)
  2776.        GOSUB 57110
  2777.        GOTO 9050
  2778. 9090 NEXT
  2779.      A$ = ""
  2780.      RETURN
  2781. '
  2782. ' *****************************************************************************
  2783. ' *  C - COMMAND FROM UTILITY MENU (CLOCK - TIME ON SYSTEM)                   *
  2784. ' *****************************************************************************
  2785. '
  2786. 9100 GOSUB 12979
  2787.      CALL GETIME
  2788.      SUBROUTINE.PARAMETER = 2
  2789.      CALL AMORPM
  2790.      QX = ((HHH*60) + MMM + (SSS/60.0))*10.0
  2791.      Q! = QX/10.0
  2792.      CALL QTPUT("Now " + TIM$ + "  Minutes on: " + STR$(Q!),1)
  2793.      RETURN
  2794. '
  2795. ' *****************************************************************************
  2796. ' * DEFINE USER FILE RECORD VARIABLES TO COMPENSATE FOR THE BUG IN QUICKBASIC *
  2797. ' * THAT REQUIRES A FIELD STATMENT TO BE EXECUTED WITHIN EACH SEPERATELY      *
  2798. ' * COMPILED PROGRAM -- EVEN THOUGH A FIELD STATEMENT WAS EXECUTED WHEN THE   *
  2799. ' * FILE WAS OPENED IN ANOTHER SEPERATELY COMPILED SUBROUTINE                 *
  2800. ' *****************************************************************************
  2801. '
  2802. 9450 FIELD 5,31 AS USER.NAME$, _
  2803.              15 AS PASSWORD$, _
  2804.               2 AS SECURITY.LEVEL$, _
  2805.              14 AS USER.OPTIONS$,  _
  2806.              24 AS CITY.STATE$, _
  2807.              19 AS MACHINE.TYPE$, _
  2808.              14 AS LAST.DATE.TIME.ON$, _
  2809.               3 AS LIST.NEW.DATE$, _
  2810.               2 AS USER.DOWNLOADS$, _
  2811.               2 AS USER.UPLOADS$, _
  2812.               2 AS ELAPSED.TIME$
  2813.      FIELD 5,128 AS USER.RECORD$
  2814.      RETURN
  2815. '
  2816. ' *****************************************************************************
  2817. ' * GET USER DEFAULTS                                                         *
  2818. ' *****************************************************************************
  2819. '
  2820. 9500 USER.SECURITY.LEVEL = CVI(SECURITY.LEVEL$)
  2821.      LAST.MESSAGE.READ = CVI(MID$(USER.OPTIONS$,3,2))
  2822.      USER.TRANSFER.DEFAULT$ = MID$(USER.OPTIONS$,5,1)
  2823.      GR = VAL(MID$(USER.OPTIONS$,6,1))
  2824.      IF NOT EIGHT.BIT THEN _
  2825.         GR = 0
  2826.      USER.GRAPHIC.DEFAULT$ = MID$(" GC",GR + 1,-(GR > 0))
  2827.      RIGHT.MARGIN = CVI(MID$(USER.OPTIONS$,7,2))
  2828. 9510 USER.OPTIONS = CVI(MID$(USER.OPTIONS$,9,2))
  2829.      PROMPT.BELL = (USER.OPTIONS AND 1) > 0
  2830.      EXPERT.USER = (USER.OPTIONS AND 2) > 0
  2831.      NULLS = (USER.OPTIONS AND 4) > 0
  2832.      UPPER.CASE = (USER.OPTIONS AND 8) > 0
  2833.      LINE.FEEDS = (USER.OPTIONS AND 16) > 0
  2834.      CHECK.BULLETIN.LOGON = (USER.OPTIONS AND 32) > 0
  2835.      SKIP.FILES.LOGON = (USER.OPTIONS AND 64) > 0
  2836.      AUTODOWNLOAD.AVAILABLE = (USER.OPTIONS AND 128) > 0
  2837.      REQ.QUES.ANSWERED = (USER.OPTIONS AND 256) > 0
  2838.      GOSUB 11480
  2839.      PAGE.LENGTH = ASC(MID$(USER.OPTIONS$,13,1))
  2840. 9520 NUL$ = MID$(STRING$(5,0),1,-5*NULLS)
  2841.      CALL SETCRLF
  2842.      PASSWORD.SAVE$ = PASSWORD$
  2843.      RETURN
  2844. '
  2845. ' *****************************************************************************
  2846. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)                              *
  2847. ' *****************************************************************************
  2848. '
  2849. 9700 IF ACTIVE.BULLETINS < 1 THEN _
  2850.         A$ = "no bulletins today" : _
  2851.         GOSUB 1397 : _
  2852.         RETURN
  2853.      IF Q > 1 THEN _
  2854.         ANS.INDEX = 2: _
  2855.         LAST.INDEX = Q: _
  2856.         GOTO 9708
  2857. 9705 FILE.NAME$ = BULLETIN.MENU$
  2858.      GOSUB 1790
  2859. 9707 GOSUB 41000
  2860.      NON.STOP = FALSE
  2861.      ANS.INDEX = 1
  2862.      A$ = "Bulletin #(s) [1 thru" + STR$(ACTIVE.BULLETINS) + _
  2863.           "], L)ist, N)ew"
  2864.      CALL SKIPLINE (1)
  2865.      GOSUB 12998
  2866.      IF Q = 0 THEN _
  2867.         RETURN
  2868.      ANS.INDEX = 1
  2869.      LAST.INDEX = Q
  2870. 9708 CALL CARRIER
  2871.      IF SUBROUTINE.PARAMETER = -1 THEN _
  2872.         RETURN 10595
  2873.      CALL ALLCAPSD (B$(),ANS.INDEX)
  2874.      ON INSTR("LN",B$(ANS.INDEX)) GOTO 9705,9760
  2875. 9711 Z$ = MID$(STR$(VAL(B$(ANS.INDEX))),2)
  2876.      IF VAL(Z$) > 0 AND VAL(Z$) <= ACTIVE.BULLETINS THEN _
  2877.         GOTO 9720
  2878.      GOTO 9725
  2879. 9720 IF NOT LOCAL.USER THEN _
  2880.         CALL UPDTCALR ("Read Bulletin " + Z$,1)
  2881.      FILE.NAME$ = BULLETIN.PREFIX$ + Z$
  2882.      CALL FINDIT (FILE.NAME$)
  2883.      IF NOT OK THEN _
  2884.         GOTO 9707
  2885.      STOP.INTERRUPTS = TRUE
  2886.      GOSUB 1790
  2887.      STOP.INTERRUPTS = FALSE
  2888.      CALL DISPLAYTR (TIME.REMAINING!)
  2889. 9725 ANS.INDEX = ANS.INDEX + 1
  2890.      IF ANS.INDEX <= LAST.INDEX THEN _
  2891.         GOTO 9708
  2892.      GOTO 9707
  2893. ' *****************************************************************************
  2894. ' *  CHECK AND REVIEW NEW BULLETINS SINCE LAST LOGON                          *
  2895. ' *****************************************************************************
  2896. 9750 CALL CHKNEWBUL (PREV.LAST.ON$,NUM.NEW.BULLETS,NEW.BULLETS$)
  2897.      CALL SKIPLINE (1)
  2898.      A$ = STR$(NUM.NEW.BULLETS) + " NEW BULLETIN(S) since last call" + _
  2899.              NEW.BULLETS$
  2900.      GOSUB 12979
  2901.      RETURN
  2902. 9760 ' ****  [entry when want review plus chance to read] *********
  2903.      GOSUB 9750
  2904.      IF NUM.NEW.BULLETS > 0 THEN _
  2905.         LAST.INDEX = Q : _
  2906.         A$ = "READ new bulletins (Y=[ENTER],N)" : _
  2907.         GOSUB 12995 : _
  2908.         IF NOT NO THEN _
  2909.            ANS.INDEX = 2: _
  2910.            GOTO 9708
  2911.      IF ANS.INDEX < 1 THEN _
  2912.         RETURN _
  2913.      ELSE _
  2914.         GOTO 9707
  2915. '
  2916. ' *****************************************************************************
  2917. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)                    *
  2918. ' *****************************************************************************
  2919. '
  2920. 9800 IF CONFERENCE.MODE THEN _
  2921.         A$ = "Nodes won't display within a conference!" : _
  2922.         GOSUB 12977 : _
  2923.         RETURN
  2924.      GOSUB 12979
  2925.      CALL OPENMSG
  2926.      IF EC = 64 THEN _
  2927.         EC = 0 : _
  2928.         GOTO 5360
  2929.      FIELD 1, 128 AS MESSAGE.RECORD$
  2930.      FOR NODE.INDEX = 2 TO NODES.IN.SYSTEM + 1
  2931.         GET 1,NODE.INDEX
  2932.         A$ = MID$(MESSAGE.RECORD$,1,31) + _
  2933.         "Node" + _
  2934.         STR$(NODE.INDEX - 1) + _
  2935.         LEFT$(" in",1-2*(MID$(MESSAGE.RECORD$,57,1) <> "A")) + _
  2936.         "active " + _
  2937.         MID$(MESSAGE.RECORD$,60,4) + _
  2938.         " Baud"
  2939.         GOSUB 12979
  2940.      NEXT
  2941.      RETURN
  2942. '
  2943. ' *****************************************************************************
  2944. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)                           *
  2945. ' *****************************************************************************
  2946. '
  2947. 10070 CALL MUSIC (7)
  2948.       FILE.NAME$ = COMMENTS.FILE$
  2949.       GOSUB 6000
  2950.       RETURN
  2951. '
  2952. ' *****************************************************************************
  2953. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)                            *
  2954. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)                              *
  2955. ' *****************************************************************************
  2956. '
  2957. 10090 CALL MUSIC (6)
  2958.       A$ = "List - U)sers, R)ecent callers"
  2959.       CALL SKIPLINE (1)
  2960.       GOSUB 12998
  2961.       IF Q = 0 THEN _
  2962.          RETURN
  2963.       CALL ALLCAPSD (B$(),1)
  2964.       ON INSTR("UR",B$(1)) + 1 GOTO 10090,10096,57000
  2965. 10096 GOSUB 12700
  2966.       CALL OPENUSER
  2967.       GOSUB 9450
  2968.       STOP.INTERRUPTS = TRUE
  2969.       NON.STOP = (PAGE.LENGTH < 1)
  2970.       I = 1
  2971. 10097 IF I > HIGHEST.USER.RECORD THEN GOTO 10099
  2972.         GET 5,I
  2973.         X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  2974.         IF ASC(X$)=0 OR LEFT$(X$,3)="   " OR LEFT$(PASSWORD$,3)="   " THEN _
  2975.            GOTO 10098
  2976.         GOSUB 57110
  2977.         CALL QTPUT (LEFT$(X$,36)+CITY.STATE$+LAST.DATE.TIME.ON$,1)
  2978. 10098 I = I + 1
  2979.       GOTO 10097
  2980. 10099 A$ = ""
  2981.       STOP.INTERRUPTS = FALSE
  2982.       RETURN
  2983. '
  2984. ' *****************************************************************************
  2985. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGES)                           *
  2986. ' *****************************************************************************
  2987. '
  2988. 10390 A$ = "Recover Msg #"
  2989.       GOSUB 12995
  2990.       MESSAGE.TO.RECOVER = VAL(B$(1))
  2991.       IF MESSAGE.TO.RECOVER < 1 THEN _
  2992.          GOTO 12980
  2993.       CALL OPENMSG
  2994.       IF EC = 64 THEN _
  2995.          EC = 0 : _
  2996.          GOTO 5360
  2997.       FIELD 1, 128 AS MESSAGE.RECORD$
  2998.       ACTION.FLAG = FALSE
  2999.       CALL RECOVMSG (MESSAGE.TO.RECOVER,FIRST.MESSAGE.RECORD,ACTION.FLAG)
  3000.       IF ACTION.FLAG THEN _
  3001.          A$ = "Re-Loading Msg File" : _
  3002.          GOSUB 12979 : _
  3003.          GOSUB 1900
  3004.       RETURN
  3005.  
  3006. '
  3007. ' *****************************************************************************
  3008. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)                            *
  3009. ' *****************************************************************************
  3010. '
  3011. 10530 A$ = "Delete comments (Y/N)"
  3012.       GOSUB 12995
  3013.       IF YES THEN _
  3014.          CLOSE 2 : _
  3015.          IF SHARE.IT THEN _
  3016.             OPEN COMMENTS.FILE$ FOR OUTPUT SHARED AS #2 _
  3017.          ELSE OPEN "O",2,COMMENTS.FILE$
  3018.       CLOSE 2
  3019. 10550 RETURN 1200
  3020. '
  3021. ' *****************************************************************************
  3022. ' *  TIME LIMIT EXCEEDED EXIT                                                 *
  3023. ' *****************************************************************************
  3024. '
  3025. 10553 A$ = MID$("SessionDaily",-7*LIMIT.DAILY.TIME+1,7) + _
  3026.                 " time limit exceeded"
  3027.       CALL UPDTCALR (A$,1)
  3028.       GOSUB 1397
  3029. '
  3030. ' *****************************************************************************
  3031. ' *  Q - COMMAND FROM GLOBAL FUNCTIONS                                        *
  3032. ' *****************************************************************************
  3033. '
  3034. 10560 CHAT.AVAILABLE = FALSE
  3035.       GOSUB 9100
  3036.       IF NOT SYSOP THEN _
  3037.          QUESTIONNAIRE$ = "EPILOG.DEF" : _
  3038.          GOSUB 11510
  3039.       CALL QTPUT(FIRST.NAME$ + ", Thanks and please call again!",1)
  3040.       IF BPS = -1 THEN _
  3041.          CALL DELAYIT (1)
  3042.       IF LOCAL.USER.MODE OR NOT LOCAL.USER THEN _
  3043.          CALL UPDTCALR ("Logged off",1)
  3044.       CALL MUSIC (4)
  3045.       GOTO 10595
  3046. 10570 IF TIME.REMAINING! > 1 AND NOT EXPERT.USER THEN _
  3047.          A$ = "Disconnect the call (Y,N=[ENTER])":_
  3048.          GOSUB 12995:_
  3049.          IF NOT YES THEN _
  3050.             RETURN
  3051.       GOTO 10560
  3052. 10590 CALL UPDTCALR ("Sleep Disconnect",1)
  3053. 10595 CALL GETIME
  3054.       GOSUB 13700
  3055.       IF (SYSOP OR LOCAL.USER) AND MAIN.USER.FILE.INDEX = 0 THEN _
  3056.          GOSUB 5700
  3057.       IF MAIN.USER.FILE.INDEX < 1 THEN _
  3058.      CLS : _
  3059.          GOTO 13540
  3060.       IF CONFERENCE.MODE THEN _
  3061.          GOSUB 5380
  3062.       SYSOP = FALSE
  3063.       CALL UPDATEU
  3064.       GOTO 13540
  3065. 10620 CALL UPDTCALR(LG$(LOGON.ERROR.INDEX),2)
  3066. 10621 IF ACTIVE.USER.NAME$ = "" THEN _
  3067.          ACTIVE.USER.NAME$ = "NAME UNAVAILABLE"
  3068.       Z$ = ACTIVE.USER.NAME$ + _
  3069.            " on at " + _
  3070.            CURRENT.DATE$ + _
  3071.            ", " + _
  3072.            TIM$ + _
  3073.            "** LOGON DENIED **, " + _
  3074.            BAUD.PARITY$
  3075.       NG$ = Z$ + SPACE$(128-LEN(Z$))
  3076. 10698 CALL MUSIC (5)
  3077.       A$ = "Access denied!"
  3078.       GOSUB 12976
  3079.       IF BPS = -1 THEN _
  3080.          CALL DELAYIT (1)
  3081.       GOTO 13545
  3082. '
  3083. ' *****************************************************************************
  3084. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)                           *
  3085. ' *****************************************************************************
  3086. '
  3087. 10925 UTILITY.MARGIN.CHANGE = TRUE
  3088.       GOSUB 3100
  3089.       UTILITY.MARGIN.CHANGE = FALSE
  3090.       RETURN
  3091. '
  3092. ' *****************************************************************************
  3093. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)                                *
  3094. ' *****************************************************************************
  3095. '
  3096. 10930 IF DOS.VERSION < 2 OR REQUIRED.RINGS = 0 THEN _
  3097.          A$ = "Remote DOS unavailable" : _
  3098.          RETURN
  3099. 10932 IF LOCAL.USER AND NOT DEBUG THEN _
  3100.          A$ = "Only for remote SYSOP's" : _
  3101.          RETURN
  3102.       CALL DOSEXIT
  3103.       GOTO 31000
  3104. '
  3105. ' *****************************************************************************
  3106. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)                               *
  3107. ' *****************************************************************************
  3108. '
  3109. 10970 IF NOT DOORS.AVAILABLE OR REQUIRED.RINGS = 0 THEN _
  3110.          A$ = "All doors locked!" : _
  3111.          RETURN
  3112.       IF CONFERENCE.MODE THEN _
  3113.          A$ = "Cannot exit to a Door when in a Conference!" : _
  3114.          RETURN
  3115. 10973 FILE.NAME$ = MENU$(5)
  3116.       GOSUB 43025
  3117. 10974 A$ = "Open which door"
  3118.       GOSUB 12998
  3119.       IF Q = 0 THEN _
  3120.          RETURN
  3121.       Z$ = B$(1)
  3122.       CALL WORDINFILE (FILE.NAME$,Z$,FOUND)
  3123.       CALL CARRIER
  3124.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3125.          RETURN 10595
  3126.       IF NOT FOUND THEN _
  3127.          CALL QTPUT ("No such Door "+Z$,1): _
  3128.          GOTO 10973
  3129.       Z$ = Z$ + ".BAT"
  3130. 10986 CALL FINDIT (Z$)
  3131.       IF NOT OK THEN _
  3132.          CALL UPDTCALR ("Door " + Z$ + " missing",2) : _
  3133.          GOTO 10973
  3134.       CALL DOOREXIT
  3135. '
  3136. ' *****************************************************************************
  3137. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)                      *
  3138. ' *****************************************************************************
  3139. '
  3140. 11000 TU = USER.FILE.INDEX
  3141.       STOP.INTERRUPTS = TRUE
  3142.       I = 1
  3143.       SCAN.USERS = FALSE
  3144.       A$ = "A)dd, L)st, P)rt, M)od, S)can users"
  3145.       GOSUB 12998
  3146. 11003 IF Q = 0 THEN _
  3147.          GOTO 20093
  3148.       QQ = 0
  3149.       Z$ = LEFT$(B$(1),1)
  3150.       CALL ALLCAPS (Z$)
  3151.       IF Z$ = "A" THEN _
  3152.          GOTO 12300 _
  3153.       ELSE IF Z$ = "M" THEN _
  3154.               STOP.INTERRUPTS = FALSE _
  3155.            ELSE IF Z$ = "P" THEN _
  3156.                    QQ = TRUE _
  3157.                 ELSE IF Z$ = "S" THEN _
  3158.                         SCAN.USERS = TRUE : _
  3159.                         STOP.INTERRUPTS = FALSE _
  3160.                      ELSE IF Z$ <> "L" THEN _
  3161.                              GOTO 11000
  3162. 11005 CALL OPENUSER
  3163.       GOSUB 9450
  3164.       Z = 1
  3165.       IF SCAN.USERS THEN _
  3166.          A$ = "Scan for N)ame, P)wd, C)ity/St, or L)evel" : _
  3167.          GOSUB 12995 : _
  3168.          SCAN.FUNCTION$ = LEFT$(B$(1),1) : _
  3169.          CALL ALLCAPS (SCAN.FUNCTION$) : _
  3170.          CR = 0 : _
  3171.          GOSUB 12979 : _
  3172.          GOSUB 12966 : _
  3173.       GOTO 12962
  3174. 11010 FOR J = Z TO HIGHEST.USER.RECORD
  3175.         GET 5,J
  3176. 11015   X$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
  3177.         IF ASC(X$) = 0 OR LEFT$(X$,3) = "   " THEN _
  3178.            GOTO 11310
  3179.         OF = CVI(SECURITY.LEVEL$)
  3180.         A$ = RIGHT$("     "+STR$(LOC(5)),4) + _
  3181.              ":" + _
  3182.              USER.NAME$ + _
  3183.              "SECURITY" + _
  3184.              RIGHT$("     "+STR$(OF),5) + _
  3185.              " "
  3186. 11020   A$ = A$ + _
  3187.              "Password = " + _
  3188.              PASSWORD$
  3189. 11025   IF QQ THEN _
  3190.            CALL PRINTIT (A$)
  3191. 11027   GOSUB 12979
  3192.         IF RET <> 0 THEN _
  3193.            GOTO 11330
  3194.         IF OF < MINIMUM.LOGON.SECURITY THEN _
  3195.            A$ = "     <Locked out>  " : _
  3196.            GOTO 11030
  3197.         IF OF >= SYSOP.SECURITY.LEVEL THEN _
  3198.            A$ = "     (SYSOP)       " : _
  3199.            GOTO 11030
  3200.         A$ = SPACE$(19)
  3201. 11030   A$ = A$ + _
  3202.              LAST.DATE.TIME.ON$ + _
  3203.              "   " + _
  3204.              CITY.STATE$ + _
  3205.              MACHINE.TYPE$
  3206. 11100   IF QQ THEN _
  3207.            CALL PRINTIT (A$)
  3208. 11101   CALL QTPUT(A$,1)
  3209.         IF RET <> 0 THEN _
  3210.            GOTO 11330
  3211.         A$ = "  DOWNLOADS = " + _
  3212.              RIGHT$("     "+STR$(CVI(USER.DOWNLOADS$)),5) + "   " + _
  3213.              "UPLOADS = " + _
  3214.              RIGHT$("     "+STR$(CVI(USER.UPLOADS$)),5) + "   " + _
  3215.              " Times on ="
  3216.          A$ = A$+RIGHT$("     "+STR$(CVI(MID$(USER.OPTIONS$,1,2))),5) + "   " + _
  3217.              "TIME USED = " + _
  3218.              RIGHT$("     "+STR$(CVI(ELAPSED.TIME$)),5) + _
  3219.              " Min"
  3220.         IF QQ THEN _
  3221.            CALL PRINTIT (A$)
  3222. 11105   CALL QTPUT (A$,1)
  3223.         IF RET <> 0 THEN _
  3224.            GOTO 11330
  3225.         IF NOT RESTRICT.BY.DATE THEN _
  3226.            GOTO 11107
  3227.         GOSUB 11480
  3228.         A$ = "Subscription date = " + REG.DISPLAY.DATE$
  3229.         IF QQ THEN _
  3230.            CALL PRINTIT (A$)
  3231.         CALL QTPUT (A$,1)
  3232.         IF RET <> 0 THEN _
  3233.            GOTO 11330
  3234. 11107   IF STOP.INTERRUPTS THEN _
  3235.            GOTO 11310
  3236. 11110   CALL QTPUT ("D)elete,  F)ind,  M)enu,  N)ew pwd,  P)rint,",1)
  3237.         A$ = "R)eset graphics,  Q)uit,  S)ecurity, #)user"
  3238.         IF RESTRICT.BY.DATE THEN _
  3239.            A$ = A$ + ", $)Reg Date"
  3240.         GOSUB 12995
  3241.         IF NOT SCAN.USERS AND Q = 0 THEN _
  3242.            GOTO 11310
  3243. 11115   Z$ = LEFT$(B$(1),1)
  3244.         CALL ALLCAPS (Z$)
  3245.         X = INSTR("DNPQFSMR$",Z$)
  3246.         IF Z$ = "" AND SCAN.USERS THEN _
  3247.            GOTO 12965
  3248.         ON X GOTO 11130,11160,11220,11320,11340,11390,11330,11400,11450
  3249. 11125   Z = VAL(B$)
  3250.         IF Z < 1 OR Z > HIGHEST.USER.RECORD-1 THEN _
  3251.            GOTO 11310
  3252.         GOTO 11010
  3253. '
  3254. ' *****************************************************************************
  3255. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)               *
  3256. ' *****************************************************************************
  3257. '
  3258. 11130   A$ = "Delete user (Y/N)"
  3259.         GOSUB 12995
  3260.         IF NO THEN _
  3261.            GOTO 11290
  3262.         LSET USER.NAME$ = CHR$(0)+"deleted user"
  3263.         LSET SECURITY.LEVEL$ = MKI$(MINIMUM.LOGON.SECURITY -1)
  3264.         LSET LAST.DATE.TIME.ON$ = "01/01/80" + " " + TIME.LOGGED.ON$
  3265.         GOTO 11290
  3266. '
  3267. ' *****************************************************************************
  3268. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)      *
  3269. ' *****************************************************************************
  3270. '
  3271. 11160   GOSUB 12800
  3272.         GOTO 11290
  3273. '
  3274. ' *****************************************************************************
  3275. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)           *
  3276. ' *****************************************************************************
  3277. '
  3278. 11220   QQ = NOT QQ
  3279.         GOTO 11015
  3280. 11290   USER.FILE.INDEX = LOC(5)
  3281.         GOSUB 12989
  3282.         PUT 5,USER.FILE.INDEX
  3283.         GOSUB 12991
  3284.         USER.FILE.INDEX = 0
  3285.         GOTO 11015
  3286. 11310   IF SCAN.USERS THEN _
  3287.            GOTO 12965
  3288. 11311 NEXT
  3289. '
  3290. ' *****************************************************************************
  3291. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)         *
  3292. ' *****************************************************************************
  3293. '
  3294. 11320 CLOSE 5
  3295.       USER.FILE.INDEX = TU
  3296.       RETURN 1200
  3297. '
  3298. ' *****************************************************************************
  3299. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)     *
  3300. ' *****************************************************************************
  3301. '
  3302. 11330 CLOSE 2
  3303.       GOTO 11000
  3304. '
  3305. ' *****************************************************************************
  3306. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)                 *
  3307. ' *****************************************************************************
  3308. '
  3309. 11340 A$ = PROMPT.HASH$+" to find"
  3310.       CALL SKIPLINE (1)
  3311.       GOSUB 12995
  3312.       IF Q = 0 THEN _
  3313.          GOTO 11340
  3314.       TEMP.HASH.VALUE$ = B$(1)
  3315.       IF LEN(TEMP.HASH.VALUE$) < 3 OR LEN(TEMP.HASH.VALUE$) > LEN.HASH THEN _
  3316.          GOTO 11340
  3317.       CALL ALLCAPS (TEMP.HASH.VALUE$)
  3318.       IF START.INDIV < 1 THEN _
  3319.          GOTO 11345
  3320. 11342 A$ = PROMPT.INDIV$+" to find"
  3321.       GOSUB 12995
  3322.       IF Q = 0 THEN _
  3323.          GOTO 11342
  3324.       TEMP.INDIV.VALUE$ = B$(1)
  3325.       IF LEN(TEMP.INDIV.VALUE$) < 3 OR LEN(TEMP.INDIV.VALUE$) > LEN.INDIV THEN _
  3326.          GOTO 11342
  3327.       CALL ALLCAPS (TEMP.INDIV.VALUE$)
  3328. 11345 GOSUB 12600
  3329.       GOSUB 12984
  3330.       USER.FILE.INDEX = 0
  3331.       IF FOUND THEN _
  3332.          GOTO 11015
  3333. 11380 A$ = TEMP.HASH.VALUE$ + " " + TEMP.INDIV.VALUE$ + " not found"
  3334.       GOSUB 12977
  3335.       GOTO 11310
  3336. '
  3337. ' *****************************************************************************
  3338. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)      *
  3339. ' *****************************************************************************
  3340. '
  3341. 11390 GOSUB 11395
  3342.       LSET SECURITY.LEVEL$ = MKI$(OF)
  3343.       GOTO 11290
  3344. 11395 A$ = "Enter security level"
  3345.       GOSUB 12995
  3346.       CALL ALLCAPSD (B$(),1)
  3347.       Z$ = B$(1)
  3348.       OF = VAL(Z$)
  3349.       IF OF > USER.SECURITY.LEVEL THEN _
  3350.          OF = USER.SECURITY.LEVEL
  3351.       RETURN
  3352. '
  3353. ' *****************************************************************************
  3354. ' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)       *
  3355. ' *****************************************************************************
  3356. '
  3357. 11400 LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,5) + _
  3358.                            "0" + _
  3359.                            MID$(USER.OPTIONS$,7)
  3360.       GOTO 11290
  3361. '
  3362. ' *****************************************************************************
  3363. ' *  $ - COMMAND FROM 5 - USER MAINTENANCE (CHANGE SUBSCRIPTION DATE)         *
  3364. ' *****************************************************************************
  3365. '
  3366. 11450 A$ = "Enter new subscription date"
  3367.       GOSUB 12995
  3368.       IF Q = 0 THEN _
  3369.          GOTO 11015
  3370.       DATE.HOLD$ = DATE$
  3371. 11455 DATE$ = B$(1)
  3372.       DATE$ = DATE.HOLD$
  3373.       WORK.DATE$ = B$(1)
  3374.       GOSUB 11470
  3375.       LSET USER.OPTIONS$ = LEFT$(USER.OPTIONS$,10) + _
  3376.                            REG.DATE$ + _
  3377.                            MID$(USER.OPTIONS$,13)
  3378.       GOSUB 11480
  3379.       GOTO 11290
  3380. '
  3381. ' *****************************************************************************
  3382. ' *  CALCULATE SUBSCRIPTION DATES                                             *
  3383. ' *****************************************************************************
  3384. '
  3385. 11470 IF LEN(WORK.DATE$) < 10 THEN _
  3386.          WORK.DATE$ = LEFT$(WORK.DATE$,6) + "19" + RIGHT$(WORK.DATE$,2)
  3387.       TODAY.REG.YY = VAL(MID$(WORK.DATE$,7))
  3388.       TODAY.REG.MM = VAL(LEFT$(WORK.DATE$,2))
  3389.       TODAY.REG.DD = VAL(MID$(WORK.DATE$,4,2))
  3390.       CALL TWOBYTEDATE (TODAY.REG.YY,TODAY.REG.MM,TODAY.REG.DD,REG.DATE$)
  3391.       RETURN
  3392. 11480 X$ = MID$(USER.OPTIONS$,11,2)
  3393.       IF CVI(X$) <> 0 THEN _
  3394.          REG.DATE$ = X$ : _
  3395.       ELSE GOSUB 11482
  3396.       CALL GETYMD (REG.DATE$,1,USER.REG.YY)
  3397.       CALL GETYMD (REG.DATE$,2,USER.REG.MM)
  3398.       CALL GETYMD (REG.DATE$,3,USER.REG.DD)
  3399.       REG.DISPLAY.DATE$ = RIGHT$("00"+MID$(STR$(USER.REG.MM),2),2) + _
  3400.                           "/" + _
  3401.                           RIGHT$("00"+MID$(STR$(USER.REG.DD),2),2) + _
  3402.                           "/" + _
  3403.                           RIGHT$(STR$(USER.REG.YY),2)
  3404.       IF CVI(X$) = 0 THEN _
  3405.          REG.DISPLAY.DATE$ = "00/00/00"
  3406.       RETURN
  3407. 11482 WORK.DATE$ = DATE$
  3408.       GOTO 11470
  3409. '
  3410. ' *****************************************************************************
  3411. ' *  NEW USER SUBSCRIPTION OR SYSOP OPTION 8 (TEST SUBSCRIPTION SCRIPT)       *
  3412. ' *****************************************************************************
  3413. '
  3414. 11510 FILE.NAME$ = LEFT$(WELCOME.FILE$,2) + QUESTIONNAIRE$
  3415. 11520 CALL FINDIT (FILE.NAME$)
  3416.       IF NOT OK THEN _
  3417.          RETURN
  3418.       REDIM A$(256)
  3419.       CALL ASKUSERS
  3420.       REDIM A$(ADIM)
  3421.       IF SUBROUTINE.PARAMETER = - 1 THEN _
  3422.          RETURN 10595
  3423.       RETURN
  3424. '
  3425. ' *****************************************************************************
  3426. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)                  *
  3427. ' *****************************************************************************
  3428. '
  3429. 12300 A1$ = ""
  3430.       ATTEMPTS = 0
  3431.       USER.SECURITY.LEVEL.SAVE = USER.SECURITY.LEVEL
  3432.       FIRST.NAME.SAVE$ = FIRST.NAME$
  3433.       LAST.NAME.SAVE$ = LAST.NAME$
  3434.       ACTIVE.USER.NAME.SAVE$ = ACTIVE.USER.NAME$
  3435.       CITY.STATE.SAVE$ = CI$
  3436.       HASH.VALUE.SAVE$ = HASH.VALUE$
  3437.       INDIV.VALUE.SAVE$ = INDIV.VALUE$
  3438.       GOSUB 12500
  3439.       GOSUB 12840
  3440.       GOSUB 12850
  3441.       GOSUB 12598
  3442.       IF USER.FILE.INDEX = 0 THEN _
  3443.          GOSUB 12984 : _
  3444.          GOTO 12330
  3445.       IF FOUND THEN _
  3446.          PRINT "User already exists" : _
  3447.          GOSUB 12984 : _
  3448.          GOTO 12330
  3449. 12310 GOSUB 12630
  3450.       GOSUB 12800
  3451.       GOSUB 11395
  3452.       TEMP.SECURITY.LEVEL = OF
  3453.       GOSUB 12900
  3454.       LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  3455.                                 " " + _
  3456.                                 TIME.LOGGED.ON$
  3457.       GOSUB 12960
  3458.       CALL ALLCAPSD (B$(),1)
  3459.       LSET CITY.STATE$ = B$(1)
  3460.       LSET ELAPSED.TIME$ = MKI$(0)
  3461.       IF START.HASH > 1 THEN _
  3462.          MID$(USER.RECORD$,START.HASH,LEN.HASH) = HASH.VALUE$
  3463.       IF START.INDIV > 1 THEN _
  3464.          MID$(USER.RECORD$,START.INDIV,LEN.INDIV) = INDIV.VALUE$
  3465.       PUT 5,USER.FILE.INDEX
  3466. 12320 GOSUB 12991
  3467. 12330 USER.SECURITY.LEVEL = USER.SECURITY.LEVEL.SAVE
  3468.       FIRST.NAME$ = FIRST.NAME.SAVE$
  3469.       LAST.NAME$ = LAST.NAME.SAVE$
  3470.       ACTIVE.USER.NAME$ = ACTIVE.USER.NAME.SAVE$
  3471.       CI$ = CITY.STATE.SAVE$
  3472.       HASH.VALUE$ = HASH.VALUE.SAVE$
  3473.       INDIV.VALUE$ = INDIV.VALUE.SAVE$
  3474.       USER.FILE.INDEX = TU
  3475.       GOTO 11000
  3476. '
  3477. ' *****************************************************************************
  3478. ' *  GET USER FIRST AND LAST NAMES                                            *
  3479. ' *****************************************************************************
  3480. '
  3481. 12500 IF ATTEMPTS > 5 THEN _
  3482.          FF = TRUE : _
  3483.          RETURN
  3484. 12510 GOSUB 12700
  3485.       ATTEMPTS = ATTEMPTS + 1
  3486.       A$ = A1$ + "FIRST Name"
  3487.       CALL SKIPLINE (1)
  3488.       GOSUB 12995
  3489.       IF Q = 0 THEN _
  3490.          GOTO 12500
  3491.       CALL ALLCAPSD (B$(),1)
  3492.       Z$ = B$(1)
  3493.       GOSUB 5100
  3494.       FIRST.NAME$ = LEFT$(Z$ + SPACE$(2),INSTR(Z$ +SPACE$(2),SPACE$(2))-1)
  3495.       IF Q <> 1 THEN _
  3496.          CALL ALLCAPSD (B$(),2) : _
  3497.          Z$ = B$(2) : _
  3498.          GOTO 12540
  3499. 12530 A$ = A1$ + "LAST Name"
  3500.       GOSUB 12995
  3501.       CALL ALLCAPSD (B$(),1)
  3502.       Z$ = B$(1)
  3503. 12540 GOSUB 5100
  3504.       LAST.NAME$ =LEFT$(Z$ + SPACE$(2),INSTR(Z$ +SPACE$(2),SPACE$(2))-1)
  3505.       IF LEN(LAST.NAME$) < 2 THEN _
  3506.          IF LEN(FIRST.NAME$) > 2 THEN _
  3507.             GOTO 12500
  3508.       IF (LEN(FIRST.NAME$) + LEN(LAST.NAME$)) > 30 THEN _
  3509.          GOTO 12500
  3510.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  3511.          IF (LEN(FIRST.NAME$) < 2 OR LEN(LAST.NAME$) < 2) THEN _
  3512.             GOTO 12500 _
  3513.          ELSE IF LEFT$(FIRST.NAME$,1)=" " OR LEFT$(LAST.NAME$,1)=" " THEN _
  3514.                  GOTO 12500
  3515. 12550 ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + " " + LAST.NAME$,1,31)
  3516.       Z$ = FIRST.NAME$
  3517.       RETURN
  3518. '
  3519. ' *****************************************************************************
  3520. ' *  CHECK FOR NAMES NOT ALLOWED                                              *
  3521. ' *****************************************************************************
  3522. '
  3523. 12570 FOUND = FALSE
  3524.       CALL OPENWORK (TRASHCAN.FILE$)
  3525.       IF EC = 53 THEN _
  3526.          GOTO 710
  3527. 12580 IF EOF(2) THEN _
  3528.          RETURN
  3529.       INPUT #2,INVALID.NAME$
  3530.       IF Z$ <> INVALID.NAME$ THEN _
  3531.          GOTO 12580
  3532.       FOUND = TRUE
  3533.       RETURN
  3534. 12595 CALL QTPUT ("Real name required. Call traced & recorded",1)
  3535.       GOTO 10621
  3536. '
  3537. ' *****************************************************************************
  3538. ' *  COMMON SEARCH USER FILE ROUTINE                                          *
  3539. ' *****************************************************************************
  3540. '
  3541. 12598 TEMP.HASH.VALUE$ = HASH.VALUE$
  3542.       TEMP.INDIV.VALUE$ = INDIV.VALUE$
  3543. 12600 GOSUB 4910
  3544.       GOSUB 12988
  3545.       IF NOT PRIVATE.DOOR THEN _
  3546.          CALL QTPUT ("Checking Users...",1)
  3547. 12605 CALL OPENUSER
  3548.       GOSUB 9450
  3549.       CALL FINDUSER (TEMP.HASH.VALUE$,TEMP.INDIV.VALUE$,START.HASH,LEN.HASH,_
  3550.                      START.INDIV,LEN.INDIV,HIGHEST.USER.RECORD,FOUND,_
  3551.                      USER.FILE.INDEX,SL)
  3552.      IF FOUND THEN _
  3553.         RETURN
  3554.      IF CURRENT.USER.COUNT < HIGHEST.USER.RECORD*.95 THEN _
  3555.         RETURN
  3556.       A$ = "No room for new users in " + GRN$
  3557.       CALL UPDTCALR (A$,2)
  3558.       IF REMEMBER.NEW.USERS AND NOT SURVIVE.NOUSER.ROOM THEN _
  3559.          GOSUB 1397
  3560.       USER.FILE.INDEX = 0
  3561.       IF SURVIVE.NOUSER.ROOM THEN _
  3562.          REMEMBER.NEW.USERS = FALSE
  3563.       RETURN
  3564. ' **********************************************************************
  3565. ' *  Augment user count, lock 4 rec block in user, unlock files        *
  3566. ' **********************************************************************
  3567. 12630 GOSUB 23000
  3568.       CURRENT.USER.COUNT = CURRENT.USER.COUNT+(SL = 0)*REMEMBER.NEW.USERS
  3569. 12632 GOSUB 24000
  3570.       GOSUB 12987
  3571.       IF REMEMBER.NEW.USERS THEN _
  3572.          GOSUB 12989
  3573.       GOSUB 12990
  3574.       RETURN
  3575. '
  3576. ' *****************************************************************************
  3577. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING                   *
  3578. ' *****************************************************************************
  3579. '
  3580. 12700 IF CONFERENCE.MODE THEN _
  3581.          A$ = "Users of " + GRN$ + ":" : _
  3582.          GOSUB 12979
  3583.       RETURN
  3584. '
  3585. ' *****************************************************************************
  3586. ' *  GET PASSWORD FROM NEWUSER                                                *
  3587. ' *****************************************************************************
  3588. '
  3589. 12800 A$ = "Enter PASSWORD you'll use to logon again"
  3590.       GOSUB 12995
  3591.       IF USER.SECURITY.LEVEL.SAVE < SYSOP.SECURITY.LEVEL THEN _
  3592.          IF B$(1) = SPACE$(LEN(B$(1))) THEN _
  3593.             GOTO 12800
  3594.       IF LEN(B$(1)) > 15 THEN _
  3595.          CALL QTPUT ("15 Char. Max",1) : _
  3596.          GOTO 12800
  3597.       CALL ALLCAPSD (B$(),1)
  3598.       Z$ = B$(1)
  3599.       LSET PASSWORD$ = Z$
  3600.       RETURN
  3601. '
  3602. ' *****************************************************************************
  3603. ' *  GET HASH VALUE FOR CURRENT USER TO LOOK UP IN THE USER'S FILE            *
  3604. ' *****************************************************************************
  3605. '
  3606. 12840 IF START.HASH = 1 THEN _
  3607.          HASH.VALUE$ = ACTIVE.USER.NAME$:_
  3608.          RETURN
  3609.       X$ = A1$ + PROMPT.HASH$
  3610.       CALL UNTILRIGHT (X$,HASH.VALUE$,2,LEN.HASH)
  3611.       RETURN
  3612. '
  3613. ' *****************************************************************************
  3614. ' *  GET FIELD TO INDIVIDUATE ONE USER FROM ANOTHER (NAME FIELD IS DEFAULT)   *
  3615. ' *****************************************************************************
  3616. '
  3617. 12850 IF START.INDIV < 1 THEN _
  3618.          RETURN
  3619.       IF START.INDIV = 1 THEN _
  3620.          INDIV.VALUE$ = ACTIVE.USER.NAME$ : _
  3621.          RETURN
  3622.       X$ = A1$ + PROMPT.INDIV$
  3623.       CALL UNTILRIGHT (X$,INDIV.VALUE$,2,LEN.INDIV)
  3624.       RETURN
  3625. '
  3626. ' *****************************************************************************
  3627. ' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT     *
  3628. ' *****************************************************************************
  3629. '
  3630. 12860 X$ = "{" + HASH.VALUE$ + "/" + INDIV.VALUE$ + "}"
  3631.       IF LEN(Z$) < 65 THEN _
  3632.          X = 65 _
  3633.       ELSE X = LEN(Z$) + 2
  3634.       MID$(NG$,X) = X$
  3635.       RETURN
  3636. '
  3637. ' *****************************************************************************
  3638. ' *  SET NEWUSER DEFAULTS                                                     *
  3639. ' *****************************************************************************
  3640. '
  3641. 12900 LSET USER.NAME$ = ACTIVE.USER.NAME$
  3642.       LSET USER.OPTIONS$ = MKI$(0) + _
  3643.                            MKI$(0) + _
  3644.                            " 0" + _
  3645.                            MKI$(64) + _
  3646.                            MKI$(16) + _
  3647.                            MKI$(0) + _
  3648.                            CHR$(23) + _
  3649.                            STRING$(1,0)
  3650.       LSET USER.DOWNLOADS$ = MKI$(0)
  3651.       LSET USER.UPLOADS$ = MKI$(0)
  3652.       LSET SECURITY.LEVEL$ = MKI$(TEMP.SECURITY.LEVEL)
  3653.       LSET ELAPSED.TIME$ = MKI$(0)
  3654.       RETURN
  3655. ' *****************************************************************************
  3656. ' *  GET CITY AND STATE FROM NEWUSER                                          *
  3657. ' *****************************************************************************
  3658. '
  3659. 12960 A$ = A1$ + "CITY and STATE"
  3660.       GOSUB 12995
  3661.       IF Q = 0 THEN _
  3662.          GOTO 12960
  3663.       IF B$(1) = SPACE$(LEN(B$(1))) THEN _
  3664.          GOTO 12960
  3665.       CALL ALLCAPSD (B$(),1)
  3666.       LSET CITY.STATE$ = B$(1)
  3667.       CI$ = B$(1) + SPACE$(2)
  3668.       RETURN
  3669. '
  3670. ' *****************************************************************************
  3671. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)               *
  3672. ' *****************************************************************************
  3673. '
  3674. 12962 X = 0
  3675.       FF = FALSE
  3676.       A$ = "String to search"
  3677.       GOSUB 12998
  3678.       IF Q = 0 THEN _
  3679.          GOTO 11000
  3680.       CALL ALLCAPSD (B$(),1)
  3681.       WK$ = B$(1)
  3682.       IF SCAN.FUNCTION$ = "L" THEN _
  3683.          WK$ = ","+STR$(VAL(WK$))+","
  3684. 12963 GET 5,I
  3685.       GOSUB 12966
  3686.       X = INSTR(SCAN.FIELD$,WK$)
  3687.       IF X > 0 THEN _
  3688.          GOTO 11015
  3689. 12965 I = I + 1
  3690.       IF I > HIGHEST.USER.RECORD-1 THEN _
  3691.          GOTO 11000
  3692.       X = 0
  3693.       GOTO 12963
  3694. 12966 FF = INSTR("NCPL",SCAN.FUNCTION$)
  3695. 12967 ON FF GOTO 12968,12969,12970,12972
  3696.       GOTO 11000
  3697. '
  3698. ' *****************************************************************************
  3699. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)    *
  3700. ' *****************************************************************************
  3701. '
  3702. 12968 SCAN.FIELD$ = USER.NAME$
  3703.       RETURN
  3704. '
  3705. ' *****************************************************************************
  3706. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST) *
  3707. ' *****************************************************************************
  3708. '
  3709. 12969 SCAN.FIELD$ = CITY.STATE$
  3710.       RETURN
  3711. '
  3712. ' *****************************************************************************
  3713. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)*
  3714. ' *****************************************************************************
  3715. '
  3716. 12970 SCAN.FIELD$ = PASSWORD$
  3717.       RETURN
  3718. '
  3719. ' *****************************************************************************
  3720. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)   *
  3721. ' *****************************************************************************
  3722. '
  3723. 12972 SCAN.FIELD$ = ","+STR$(CVI(SECURITY.LEVEL$))+","
  3724.       RETURN
  3725. '
  3726. ' *****************************************************************************
  3727. ' * CALLS INTO SEPEARATELY COMPILED SUBROUTINES (RBBS-SUB)                    *
  3728. ' *****************************************************************************
  3729. '
  3730. '
  3731. ' *****************************************************************************
  3732. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE               *
  3733. ' *****************************************************************************
  3734. '
  3735. 12975 SUBROUTINE.PARAMETER = 1
  3736.       GOTO 12981
  3737. 12976 SUBROUTINE.PARAMETER = 2
  3738.       GOTO 12981
  3739. 12977 SUBROUTINE.PARAMETER = 3
  3740.       GOTO 12981
  3741. 12978 SUBROUTINE.PARAMETER = 4
  3742.       GOTO 12981
  3743. 12979 SUBROUTINE.PARAMETER = 5
  3744.       GOTO 12981
  3745. 12980 SUBROUTINE.PARAMETER = 6
  3746. 12981 IF USER.DATA THEN _
  3747.          PRINT A$ : _
  3748.          RETURN
  3749.       CALL TPUT
  3750. 12983 IF SUBROUTINE.PARAMETER = -1 THEN _
  3751.          GOTO 10595
  3752.       IF FUNCTION.KEY <>0 THEN _
  3753.          GOSUB 60010 : _
  3754.          SUBROUTINE.PARAMETER = 7 : _
  3755.          FUNCTION.KEY = 0 : _
  3756.          GOTO 12981
  3757.       IF SUBROUTINE.PARAMETER = 8 THEN _
  3758.          GOSUB 12995
  3759.       RETURN
  3760. '
  3761. ' *****************************************************************************
  3762. ' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S *
  3763. ' *****************************************************************************
  3764. '
  3765. 12984 SUBROUTINE.PARAMETER = 1
  3766.       GOTO 12994
  3767. 12985 SUBROUTINE.PARAMETER = 2
  3768.       GOTO 12994
  3769. 12986 SUBROUTINE.PARAMETER = 3
  3770.       GOTO 12994
  3771. 12987 SUBROUTINE.PARAMETER = 4
  3772.       GOTO 12994
  3773. 12988 SUBROUTINE.PARAMETER = 5
  3774.       GOTO 12994
  3775. 12989 SUBROUTINE.PARAMETER = 6
  3776.       GOTO 12994
  3777. 12990 SUBROUTINE.PARAMETER = 7
  3778.       GOTO 12994
  3779. 12991 SUBROUTINE.PARAMETER = 8
  3780.       GOTO 12994
  3781. 12992 SUBROUTINE.PARAMETER = 9
  3782.       GOTO 12994
  3783. 12993 SUBROUTINE.PARAMETER = 10
  3784. 12994 CALL FILELOCK
  3785.       IF SUBROUTINE.PARAMETER = -1 THEN _
  3786.          GOTO 31000
  3787.       RETURN
  3788. '
  3789. ' *****************************************************************************
  3790. ' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE                *
  3791. ' *****************************************************************************
  3792. '
  3793. 12995 SUBROUTINE.PARAMETER = 1
  3794. 12996 CALL TGET
  3795. 12997 IF SUBROUTINE.PARAMETER = -1 THEN _
  3796.          GOTO 10595
  3797.       IF FUNCTION.KEY <>0 THEN _
  3798.          GOSUB 60010 : _
  3799.          SUBROUTINE.PARAMETER = 2 : _
  3800.          FUNCTION.KEY = 0 : _
  3801.          GOTO 12996
  3802.       RETURN
  3803. 12998 A$ = A$ + PRESS.ENTER$
  3804.       GOTO 12995
  3805. '
  3806. ' *****************************************************************************
  3807. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE            *
  3808. ' *****************************************************************************
  3809. '
  3810. 13000 IF DEBUG THEN _
  3811.          A$ = "RBBS-PC DEBUG Error Trap Entry ERL=" + _
  3812.               STR$(ERL) + _
  3813.               " ERR=" + _
  3814.               STR$(ERR) : _
  3815.          IF PRINTER THEN _
  3816.             LPRINT A$ _
  3817.          ELSE PRINT A$
  3818.       IF ERR = 0 AND ERL = 210 THEN _
  3819.          PRINT "Fatal comm port error" : _
  3820.          GOTO 31000
  3821.       IF ERR = 0 THEN _
  3822.          GOTO 13540
  3823.       IF ERR = 7 THEN _
  3824.          GOTO 13650
  3825. 13010 IF ERL = 110 THEN _
  3826.          CALLERS.FILE.INDEX = 0 : _
  3827.          RESUME 112
  3828. 13033 IF ERL = 821 AND ERR = 5 THEN _
  3829.          RESUME 832
  3830. 13035 IF ERL = 1905 AND ERR = 63 THEN _
  3831.          CLOSE 1 : _
  3832.          KILL ACTIVE.MESSAGE.FILE$ : _
  3833.          RESUME 5350
  3834. 13038 IF ERL = 4371 AND ERR = 6 THEN _
  3835.          RESUME 1200
  3836. 13045 IF ERL = 5130 AND ERR = 63 THEN _
  3837.          RESUME 5160
  3838. 13047 IF ERL = 5151 AND ERR = 62 THEN _
  3839.          RESUME 5160
  3840.       IF ERL = 11455 THEN _
  3841.          CALL QTPUT ("New subscription date invalid!",1) : _
  3842.          RESUME 11450
  3843. 13087 IF ERL = 20242 AND ERR = 62 THEN _
  3844.          RESUME 20247
  3845. 13090 IF ERR = 58 THEN _
  3846.          GOTO 13190
  3847. 13100 CALL FINDTIME (TI!)
  3848.       IF (ERR = EC AND (TI! - TKA! < 5)) THEN _
  3849.          EA = EA + 1 : _
  3850.          IF EA > 10 THEN _
  3851.             GOTO 13800
  3852. 13120 EC = ERR
  3853.       CALL FINDTIME (TI!)
  3854.       IF TI! - TKA! > 5 THEN _
  3855.          EA = 0 _
  3856.       ELSE CALL FINDTIME(TKA!)
  3857. 13190 IF ERL = 20840 OR _
  3858.          ERL = 21281 OR _
  3859.          ERL = 21360 OR _
  3860.          ERL = 21420 THEN _
  3861.          SUBROUTINE.PARAMETER = 1 : _
  3862.          CALL DELAYIT (1) : _
  3863.          CALL CARRIER : _
  3864.          IF SUBROUTINE.PARAMETER THEN _
  3865.             RESUME 10595
  3866. 13225 IF ERL = 4740 THEN _
  3867.          RESUME 4745
  3868. 13260 IF ERL = 7110 THEN _
  3869.          RESUME 6080
  3870. 13270 IF ERL = 7130 AND ERR = 52 THEN _
  3871.          RESUME 7260
  3872.       IF ERL = 20262 THEN _
  3873.          RESUME 20263
  3874.       IF ERL = 21480 THEN _
  3875.          CALL LOGERROR : _
  3876.          IF ERR=57 THEN _
  3877.             CALL QTPUT("Error reading file.  Aborting download",1):_
  3878.             DOWNLOAD.COMPLETED = FALSE :_
  3879.             RESUME 21230
  3880. 13390 IF ERL = 20452 AND ERR = 53 THEN _
  3881.          RESUME 20451
  3882.       IF ERL = 20560 AND ERR = 67 THEN _
  3883.          RESUME 20451
  3884.       IF ERL = 20452 THEN _
  3885.          A$ = "Unable to delete file.  ERROR"+STR$(ERR):_
  3886.          GOSUB 12979:_
  3887.          RESUME 20453
  3888. 13395 IF ERL = 20560 AND ERR = 70 THEN _
  3889.          IF VAL(FREE.SPACE$) > 1999 THEN _
  3890.             RESUME 20451 _
  3891.          ELSE GOSUB 13417 : _
  3892.               RESUME 5160
  3893. 13396 IF ERL = 20610 AND ERR = 57 THEN _
  3894.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3895.          RESUME 20610
  3896. 13400 IF ERL = 20620 THEN _
  3897.          RESUME 20670
  3898. 13405 IF ERL = 20736 AND ERR = 53 THEN _
  3899.          RESUME 5160
  3900. 13410 IF ERL = 20840 THEN _
  3901.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3902.          RESUME 20840
  3903. 13415 IF ERL = 20900 AND ERR = 70 THEN _
  3904.          GOSUB 13417 : _
  3905.          RESUME 21230
  3906.       IF ERL = 20900 AND ERR = 75 THEN _
  3907.          RESUME 21230
  3908.       GOTO 13420
  3909. 13417 CALL QTPUT ("No room for uploads.  Try tomorrow.",1)
  3910.       RETURN
  3911. 13420 IF ERL = 21131 THEN _
  3912.          RESUME 21230
  3913. 13430 IF ERL = 21281 THEN _
  3914.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3915.          RESUME 21281
  3916. 13440 IF ERL = 21360 THEN _
  3917.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3918.          RESUME 21360
  3919. 13442 IF ERL = 21420 THEN _
  3920.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3921.          RESUME 21420
  3922. 13447 IF ERL = 53101 THEN _
  3923.          IF ERR = 53 OR ERR = 64 OR ERR = 68 THEN _
  3924.             RESUME 5160
  3925. 13450 IF 65535! = ERL THEN _
  3926.          GOTO 13800
  3927. 13460 IF ERR = 5 OR ERR = 6 THEN _
  3928.          GOTO 10595
  3929. 13470 IF ERR = 57 OR ERR = 24 OR ERR = 25 THEN _
  3930.          CALL DELAYIT (1) : _
  3931.          CALL CARRIER : _
  3932.          IF SUBROUTINE.PARAMETER THEN _
  3933.             RESUME 10595
  3934. 13480 IF ERR = 61 OR EC = 61 THEN _
  3935.          A$ = "* Disk full - terminating *" : _
  3936.          GOSUB 12976 : _
  3937.          GOSUB 33090 : _
  3938.          GOTO 31005
  3939. 13490 IF ERR = 71 THEN _
  3940.          GOSUB 13630 : _
  3941.          RESUME 1205
  3942. 13500 CALL LOGERROR
  3943.       ' print "untrapped error";str$(err);" on ";str$(erl)
  3944.       CALL QTPUT (CALLERS.RECORD$,1)
  3945.       RESUME 1200
  3946. '
  3947. ' *****************************************************************************
  3948. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")   *
  3949. ' *****************************************************************************
  3950. '
  3951. 13540 IF LOCAL.USER THEN _
  3952.          IF NOT LOCAL.USER.MODE THEN _
  3953.             GOTO 13549
  3954. 13543 IF NOT SYSOP THEN _
  3955.          IF (USER.FILE.INDEX = 0 AND REMEMBER.NEW.USERS) OR _
  3956.              NEW.USER = TRUE THEN _
  3957.              GOTO 13549
  3958. 13545 CALL UPDATEC
  3959. 13549 GOSUB 13700
  3960.       GOSUB 13555
  3961.       GOSUB 12986
  3962.       CALL OPENMSG
  3963.       IF EC = 64 THEN _
  3964.          EC = 0 : _
  3965.          GOTO 5360
  3966.       FIELD 1,128 AS MESSAGE.RECORD$
  3967.       GET 1,NODE.RECORD.INDEX
  3968.       EXIT.TO.DOORS = FALSE
  3969.       MID$(MESSAGE.RECORD$,57,1) = "I"
  3970.       MID$(MESSAGE.RECORD$,40,2) = STR$(EXIT.TO.DOORS)
  3971.       PUT 1,NODE.RECORD.INDEX
  3972.       GOSUB 12985
  3973. 13550 CLOSE 1,2,5
  3974.       CALL CARRIER
  3975.       IF NOT SUBROUTINE.PARAMETER THEN _
  3976.          OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER AND 254) : _
  3977.          CALL DELAYIT (DTR.DROP.DELAY)
  3978. 13552 IF NOT LOCAL.USER THEN _
  3979.          CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  3980. 13553 CLOSE 1,2,3,4,5
  3981.       IF RECYCLE.TO.DOS THEN _
  3982.      GOTO 31005
  3983.       RUN 100
  3984. 13555 IF LOCAL.USER THEN _
  3985.          RETURN
  3986. 13560 CALL DELAYIT (3)
  3987.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) AND 254
  3988.       CALL DELAYIT (DTR.DROP.DELAY)
  3989.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  3990.       RETURN
  3991. 13600 CLS
  3992.       LOCATE ,,0
  3993.       PRINT DF$;" file not found/invalid.  Run CONFIG."
  3994.       CALL DELAYIT (3)
  3995.       GOTO 31000
  3996. 13630 CALL QTPUT("File Menu missing",1)
  3997.       RETURN
  3998. 13650 CLS
  3999.       LOCATE ,,0
  4000.       PRINT "Not enough memory for RBBS"
  4001.       CALL DELAYIT (3)
  4002.       GOTO 31000
  4003. 13700 IF MESSAGE.FILE.LOCK THEN _
  4004.          GOSUB 12987
  4005. 13710 IF USER.FILE.LOCK THEN _
  4006.          GOSUB 12990
  4007. 13720 IF USER.BLOCK.LOCK THEN _
  4008.          GOSUB 12991
  4009.       RETURN
  4010. '
  4011. ' *****************************************************************************
  4012. ' *  FATAL ERROR HAS OCCURED!  RECYCLE SYSTEM IMMEDIATELY                     *
  4013. ' *****************************************************************************
  4014. '
  4015. 13800 A$ = "Fatal error!"
  4016.       GOSUB 12979
  4017.       GOTO 10595
  4018. '
  4019. ' *****************************************************************************
  4020. ' *         TAKE THE PHONE OFF THE HOOK FOR LOCAL SYSOP MAINTENANCE           *
  4021. ' *****************************************************************************
  4022. '
  4023. 14498 CLOSE 3
  4024.       OPEN COM.PORT$ + ":" + MODEM.INIT.BAUD$ + ",N,8,1,RS,CD,DS" AS #3
  4025. 14500 CALL MODEMPUT (MODEM.GO.OFFHOOK.COMMAND$)
  4026.       RETURN
  4027. '
  4028. ' *****************************************************************************
  4029. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)*
  4030. ' *****************************************************************************
  4031. '
  4032. 20093 IF USER.FILE.INDEX > 0 THEN _
  4033.          CALL OPENUSER : _
  4034.          GOSUB 9450 : _
  4035.          GET 5,USER.FILE.INDEX : _
  4036.          GOSUB 9500
  4037. 20095 RETURN 1200
  4038. '
  4039. ' *****************************************************************************
  4040. ' *  V - COMMAND FROM FILES MENU (VIEW ARC CONTENTS)                          *
  4041. ' *****************************************************************************
  4042. '
  4043. 20140 IF Q > 1 THEN _
  4044.          B = 2 : _
  4045.          GOTO 20142
  4046. 20141 A$ = "Enter ARCed file(s) to list"
  4047.       GOSUB 12995
  4048.       B = 1
  4049.       IF Q = 0 THEN _
  4050.          RETURN
  4051. 20142 LAST.ARC = Q
  4052.       FIRST.ARC = B
  4053.       VIOLATION$ = "View ARC"
  4054.       FOR ARC.INDEX = FIRST.ARC TO LAST.ARC
  4055.           GOSUB 20143
  4056.       NEXT
  4057.       RETURN
  4058. 20143 Z$ = B$(ARC.INDEX)
  4059.       CALL ALLCAPS (Z$)
  4060.       CALL BRKFNAME (Z$,DRV$,PREFIX$,EXT$,FALSE)
  4061.       IF EXT$ = "" THEN _
  4062.          Z$ = Z$ + ".ARC"_
  4063.       ELSE_
  4064.         IF EXT$ <> "ARC" THEN _
  4065.            CALL QTPUT ("Only .ARC files can be viewed",1) : _
  4066.            RETURN
  4067.       FILE.NAME.HOLD$ = Z$
  4068.       FILE.NAME$ = Z$
  4069.       CALL BADFILE (FILE.NAME$,BAD.FILE.NAME.INDEX)
  4070.       ON BAD.FILE.NAME.INDEX GOTO 20144,20146,20147
  4071. 20144 CALL ROTORSDIR (FILE.NAME$,SUBDIR$(),SUBDIR.COUNT+(NOT SYSOP))
  4072.       IF OK THEN _
  4073.          GOTO 20148
  4074. 20146 Z$ = B$(ARC.INDEX) + " not found!"
  4075.       CALL UPDTCALR (Z$,2)
  4076.       A$ = Z$ + " Type correct filename ([Enter] Quits)"
  4077.       GOSUB 12995
  4078.       IF Q = 0 THEN _
  4079.          RETURN
  4080.       B$(ARC.INDEX) = B$(1)
  4081.       GOTO 20143
  4082. 20147 GOSUB 1380
  4083.       GOTO 20146
  4084. 20148 CALL QTPUT(FILE.NAME.HOLD$ + " contains the following files.",1)
  4085.       CALL VIEWARC
  4086.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4087.          GOTO 13540
  4088.       RETURN
  4089. '
  4090. ' *****************************************************************************
  4091. ' *  L - COMMAND FROM FILES MENU (LIST DIRECTORY)                             *
  4092. ' *****************************************************************************
  4093. '
  4094. 20150 LIST.DIRECTORY = TRUE
  4095.       SEARCH.DATE$ = ""
  4096.       SEARCH.STRING$ = ""
  4097.       CK = 0
  4098.       IF Q > 1 THEN _
  4099.          LIST.INDEX = 2:_
  4100.          GOTO 20160
  4101.       LIST.INDEX = 1
  4102.       CALL GETDIRS ("for menu")
  4103.       IF Q = 0 THEN _
  4104.          Q = 1 : _
  4105.          B$(Q) = DIRECTORY.EXTENTION$
  4106. 20160 CALL CONVDIRS (LIST.INDEX)
  4107.       QX = Q
  4108. 20161 IF LIST.INDEX > QX THEN _
  4109.         IF NO OR (FILE.NAME.HOLD$=DIRECTORY.EXTENTION$) THEN _
  4110.            REDIM A$(ADIM) : _
  4111.            REDIM B$(ADIM) : _
  4112.            RETURN _
  4113.            ELSE X$ = B$(LIST.INDEX-1) :_
  4114.                 A$="End list.  R)elist, [Q]uit, or file(s) to download" :_
  4115.                 GOSUB 12995 : _
  4116.                 CALL ALLCAPSD (B$(),1) : _
  4117.                 IF B$(1)="R" THEN _
  4118.                    LIST.INDEX = LIST.INDEX - 1 : _
  4119.                    B$(LIST.INDEX) = X$ _
  4120.                 ELSE IF LEN(B$(1)) > 1 AND _
  4121.                         USER.SECURITY.LEVEL => OPT.SEC(18) THEN _
  4122.                         B = 1 : _
  4123.                         GOSUB 20202 : _
  4124.                         RETURN _
  4125.                      ELSE RETURN
  4126.       IF INSTR(B$(LIST.INDEX),".") THEN _
  4127.          GOTO 20172
  4128.       VIOLATION$ = "List Dir. "
  4129.       Z$ = B$(LIST.INDEX)
  4130.       CALL ALLCAPS(Z$)
  4131.       FILE.NAME.HOLD$ = Z$
  4132.       IF Z$ = DIRECTORY.EXTENTION$ THEN _
  4133.          GOTO 20164
  4134.       FOR I = 2 TO QX
  4135.           A$(I) = B$(I)
  4136.       NEXT
  4137.       CALL FMS (Z$,SEARCH.STRING$,SEARCH.DATE$,IN.FMS, _
  4138.                 CATEGORY.NAME$(),CATEGORY.CODE$(),CATEGORY.DESC$(),_
  4139.                 DOWNLOAD.FLAG,CAT.FOUND)
  4140.       WHILE DOWNLOAD.FLAG > 0 AND SUBROUTINE.PARAMETER > -1
  4141.          B = 1
  4142.          GOSUB 20202
  4143.          X$ = CATEGORY.CODE$(CAT.FOUND)
  4144.          CALL DISUPDIR (X$,SEARCH.STRING$,SEARCH.DATE$,DOWNLOAD.FLAG)
  4145.          GOSUB 41000
  4146.          CALL CARRIER
  4147.       WEND
  4148.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4149.          RETURN 10595
  4150.       FOR I = 2 TO QX
  4151.           B$(I) = A$(I)
  4152.       NEXT
  4153.       IF IN.FMS THEN _
  4154.          GOTO 20175
  4155.       IF USER.SECURITY.LEVEL < MIN.SEC.TO.VIEW THEN _
  4156.          IF FILE.NAME.HOLD$ = UPLOAD.DIR.CHECK$ THEN _
  4157.             FILE.NAME.HOLD$ = "of uploads" : _
  4158.             GOTO 20172
  4159.       FILE.NAME.HOLD$ = B$(LIST.INDEX)
  4160.       IF LIMIT.SEARCH.TO.FMS THEN _
  4161.          GOTO 20172
  4162.       IF FILE.NAME.HOLD$ = "ALL" OR FILE.NAME.HOLD$ = "A" THEN _
  4163.          DIR.INDEX = LIST.INDEX : _
  4164.          GOTO 53070
  4165.       CALL BADFILE (FILE.NAME.HOLD$,BAD.FILE.NAME.INDEX)
  4166.       ON BAD.FILE.NAME.INDEX GOTO 20163,20172,20176
  4167. 20163 FILE.NAME$ = FILE.NAME.HOLD$
  4168.       CALL BADNAME
  4169.       ON BAD.FILE.NAME.INDEX GOTO 20164,20176
  4170. 20164 IF FILE.NAME$ = UPLOAD.DIR.CHECK$ AND _
  4171.          USER.SECURITY.LEVEL >= MIN.SEC.TO.VIEW THEN _
  4172.            FILE.NAME$ = UPLOAD.PATH$ _
  4173.       ELSE FILE.NAME$ = DIRECTORY.PATH$
  4174.       FILE.NAME$ = FILE.NAME$ + _
  4175.                    FILE.NAME.HOLD$ + _
  4176.                    "." + _
  4177.                    DIRECTORY.EXTENTION$
  4178.       GOSUB 43030
  4179. 20165 CALL FINDIT (FILE.NAME$)
  4180.       IF NOT OK THEN _
  4181.          GOTO 20172
  4182. 20167 B$(0) = B$(LIST.INDEX)
  4183.       IF LIST.NEW THEN _
  4184.          GOSUB 7000 : _
  4185.          IF NO THEN _
  4186.             QX = LIST.INDEX : _
  4187.             GOTO 20170 _
  4188.          ELSE GOTO 20170
  4189.       CALL BUFFILE(FILE.NAME$)
  4190.       CALL CARRIER
  4191.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4192.          GOTO 10595
  4193. 20170 B$(LIST.INDEX) = B$(0)
  4194.       GOTO 20175
  4195. 20172 A$ = "Directory " + FILE.NAME.HOLD$ + " not found!"
  4196.       GOSUB 12977
  4197.       NO = TRUE
  4198. 20175 LIST.INDEX = LIST.INDEX + 1
  4199.       GOTO 20161
  4200. 20176 GOSUB 1380
  4201.       GOTO 20172
  4202. '
  4203. ' *****************************************************************************
  4204. ' *  D - COMMAND FROM FILES MENU (SEARCH FOR FILE TO DOWNLOAD)                *
  4205. ' *****************************************************************************
  4206. 20180 IF Q > 1 THEN _
  4207.          B = 2 : _
  4208.          GOTO 20202
  4209. 20200 A$ = "Name file(s) to " + _
  4210.             LEFT$("AUTO",-4*AUTODOWNLOAD.AVAILABLE) + "download"
  4211.       GOSUB 12995
  4212.       B = 1
  4213.       IF Q = 0 THEN _
  4214.          RETURN
  4215. 20202 LAST.DOWNLOAD = Q
  4216.       FIRST.DOWNLOAD = B
  4217.       COMMAND.TRANSFER$ = ""
  4218.       IF AUTODOWNLOAD.AVAILABLE THEN _
  4219.          COMMAND.TRANSFER$ = "X"
  4220.       AUTODOWNLOAD.IN.PROGRESS = AUTODOWNLOAD.AVAILABLE
  4221.       IF LAST.DOWNLOAD > FIRST.DOWNLOAD THEN _
  4222.          Z$ = B$(LAST.DOWNLOAD) : _
  4223.          CALL ALLCAPS(Z$) : _
  4224.          IF LEN (Z$) = 1 AND INSTR("AXCKYIGW",Z$) > 0 THEN _
  4225.             LAST.DOWNLOAD = LAST.DOWNLOAD - 1 : _
  4226.             COMMAND.TRANSFER$ = Z$ : _
  4227.             AUTODOWNLOAD.IN.PROGRESS = FALSE
  4228.       START.DRIVE = 1
  4229.       IF LAST.DOWNLOAD > FIRST.DOWNLOAD THEN _
  4230.          START.DRIVE = VAL(B$(FIRST.DOWNLOAD + 1)) : _
  4231.          IF START.DRIVE < 1 THEN _
  4232.             START.DRIVE = 1
  4233.       FOR DWN.INDEX = FIRST.DOWNLOAD TO LAST.DOWNLOAD
  4234.          GOSUB 20205
  4235. 20203 NEXT
  4236.       COMMAND.TRANSFER$ = ""
  4237.       RETURN
  4238. 20205 CALL QTPUT ("Searching for file...",1)
  4239.       FILE.NAME.HOLD$ = B$(DWN.INDEX)
  4240.       FILE.NAME$ = FILE.NAME.HOLD$
  4241.       VIOLATION$ = "Download "
  4242.       CALL BADFILE (FILE.NAME$,BAD.FILE.NAME.INDEX)
  4243.       ON BAD.FILE.NAME.INDEX GOTO 20220,20231,20233
  4244. 20220 CALL ROTORSDIR (FILE.NAME$,SUBDIR$(),SUBDIR.COUNT + _
  4245.                       ((USER.SECURITY.LEVEL < MIN.SEC.TO.VIEW) OR _
  4246.                        NOT CAN.DOWNLOAD.FROM.UP))
  4247. 20225 IF OK THEN _
  4248.          GOTO 20235
  4249. 20231 A$ = FILE.NAME.HOLD$ + " not found!"
  4250.       CALL UPDTCALR (A$,2)
  4251.       IF AUTODOWNLOAD.IN.PROGRESS THEN _
  4252.          A$ = A$ + " during AUTODOWNLOAD" : _
  4253.          GOSUB 12977 : _
  4254.          RETURN
  4255.       A$ = A$ + " Correct name ([ENTER] quits)"
  4256.       GOSUB 12995
  4257.       IF Q=0 THEN _
  4258.          RETURN
  4259.       B$(DWN.INDEX) = B$(1)
  4260.       GOTO 20205
  4261. 20233 GOSUB 1380
  4262.       GOTO 20231
  4263. 20235 CALL BADNAME
  4264.       ON BAD.FILE.NAME.INDEX GOTO  20236,20245
  4265. 20236 LINE.25$ = "(D) " + Z$
  4266.       IF AUTODOWNLOAD.IN.PROGRESS THEN _
  4267.          MID$(LINE.25$,2,1)="A"
  4268. '
  4269. ' *****************************************************************************
  4270. ' *  TEST FOR DOWNLOAD SECURITY                                               *
  4271. ' *****************************************************************************
  4272. '
  4273.       CALL OPENWORK (FILESEC.FILE$)
  4274.       IF EC = 53 THEN _
  4275.          CALL UPDTCALR ("Missing file " + FILESEC.FILE$,2) : _
  4276.          GOTO 20247
  4277.       CALL BRKFNAME (Z$,YY$,A1$,RS$,FALSE)
  4278. 20242 IF EOF(2) THEN _
  4279.          GOTO 20247 _
  4280.       ELSE INPUT #2,N$,FILE.SECURITY,FILE.PASSWORD$ : _
  4281.            CALL BRKFNAME (N$,DR$,X$,EXTENTION$,FALSE)
  4282. 20243 IF DR$ <> "" AND DR$ <> YY$ THEN _
  4283.          GOTO 20242
  4284.       CALL WILDCARD (X$,A1$)
  4285.       IF NOT OK THEN _
  4286.          GOTO 20242
  4287.       CALL WILDCARD (EXTENTION$,RS$)
  4288.       IF NOT OK THEN _
  4289.          GOTO 20242
  4290. 20244 IF USER.SECURITY.LEVEL < FILE.SECURITY THEN _
  4291.          GOTO 20245
  4292.       IF FILE.PASSWORD$ = "" THEN _
  4293.          GOTO 20247
  4294.       CALL ALLCAPS (FILE.PASSWORD$)
  4295.       IF FILE.PASSWORD$ = PASSWORD$ THEN _
  4296.          GOTO 20247
  4297.       A$ = "Enter PASSWORD to download " + FILE.NAME$
  4298.       GOSUB 12995
  4299.       IF Q = 0 THEN _
  4300.          RETURN
  4301.       CALL ALLCAPSD (B$(),1)
  4302.       IF B$(1) = FILE.PASSWORD$ THEN _
  4303.          GOTO 20247
  4304. 20245 VIOLATION$ = "DownLoad " + FILE.NAME$
  4305. 20246 GOSUB 1380
  4306.       RETURN
  4307. 20247 DF = 0
  4308.       CALL BRKFNAME (FILE.NAME$,DR$,X$,EXTENTION$,FALSE)
  4309.       IF AUTODOWNLOAD.IN.PROGRESS THEN _
  4310.          A$ = "Transferring -- " + B$(DWN.INDEX) : _
  4311.          GOSUB 12977
  4312.       IF EXTENTION$ = "" OR RELIABLE.MODE THEN _
  4313.          GOTO 20248
  4314.       IF INSTR(".WRK.FW .ARC.EXE.COM.OBJ.WKS.LBR",EXTENTION$) OR _
  4315.          MID$(EXTENTION$,2,1) = "Q" OR _
  4316.          (REQUIRE.NON.ASCII AND EXTENTION$ = "BAS") THEN _
  4317.          CALL QTPUT ("Non-ASCII required for "+FILE.NAME.HOLD$,1) : _
  4318.          DF = TRUE
  4319. 20248 A$ = ""
  4320.       GOSUB 21620
  4321.       IF FF THEN _
  4322.          GOTO 20260
  4323.       GOSUB 21600
  4324. 20260 TRANSFER.FUNCTION = 1
  4325.       ON FF GOTO 20340, _      ' ASCII FILE DOWNLOAD
  4326.                  20290, _      ' XMODEM (CHECKSUM) FILE DOWNLOAD
  4327.                  20290, _      ' XMODEM (CRC-16) FILE DOWNLOAD
  4328.                  20265, _      ' KERMIT FILE DOWNLOAD
  4329.                  20261, _      ' YMODEM FILE DOWNLOAD
  4330.                  20261, _      ' IMODEM FILE DOWNLOAD
  4331.                  20261, _      ' YMODEMG FILE DOWNLOAD
  4332.                  20261, _      ' WXMODEM FILE DOWNLOAD
  4333.                  57120         ' NO FILE DOWNLOAD
  4334. '
  4335. ' *****************************************************************************
  4336. ' *  QMXFER PROTOCOL DOWNLOADS/UPLOADS                                        *
  4337. ' *****************************************************************************
  4338. '
  4339. 20261 IF NOT EIGHT.BIT THEN _
  4340.          A$ = "Please SWITCH to N,8,1 for binary transfer" : _
  4341.          GOSUB 12975 : _
  4342.          CALL DELAYIT (3) : _
  4343.          GOSUB 20992
  4344.       IF FF = 5 OR _
  4345.          FF > 6 THEN _
  4346.          BLOCK.SIZE = 8 _
  4347.       ELSE BLOCK.SIZE = 1
  4348.       IF TRANSFER.FUNCTION = 1 THEN _
  4349.          GOSUB 20750 : _
  4350.          CLOSE 2
  4351.       IF AUTODOWNLOAD.IN.PROGRESS THEN _
  4352.          CALL SENDNAME : _
  4353.          IF ABORT THEN _
  4354.             DOWNLOAD.COMPLETED = FALSE : _
  4355.             GOSUB 50600 : _
  4356.             RETURN
  4357.       CALL TRANSFER
  4358. 20262 OPEN "I",2,"XFER-" + RIGHT$(NODE.ID$,1) + ".DEF"
  4359.       INPUT #2,A$
  4360.       INPUT #2,A$
  4361.       INPUT #2,A$
  4362.       INPUT #2,A$
  4363.       IF TRANSFER.FUNCTION = 2 THEN _
  4364.          IF LEFT$(A$,1) = "S" THEN _
  4365.             GOTO 20700 _
  4366.          ELSE GOTO 20730
  4367.       IF TRANSFER.FUNCTION = 1 THEN _
  4368.          IF LEFT$(A$,1) = "S" THEN _
  4369.             DOWNLOAD.COMPLETED = TRUE _
  4370.          ELSE DOWNLOAD.COMPLETED = FALSE
  4371.       GOSUB 50600
  4372.       RETURN
  4373. '
  4374. ' *****************************************************************************
  4375. ' *  DOWNLOAD ABORT                                                           *
  4376. ' *****************************************************************************
  4377. '
  4378. 20263 A$ = "<Download aborted>"
  4379.       DOWNLOAD.COMPLETED = FALSE
  4380.       GOTO 20390
  4381. '
  4382. ' *****************************************************************************
  4383. ' *  KERMIT INTERFACE FOR DOWNLOADS & UPLOADS                                 *
  4384. ' *****************************************************************************
  4385. '
  4386. 20265 IF TRANSFER.FUNCTION = 1 THEN _
  4387.          BLOCK.SIZE = 1 : _
  4388.          GOSUB 20750
  4389. 20266 CLOSE 2
  4390.       CALL TRANSFER
  4391.       IF TRANSFER.FUNCTION = 2 THEN _
  4392.          GOTO 20700
  4393.       DOWNLOAD.COMPLETED = TRUE
  4394.       GOSUB 50600
  4395.       RETURN
  4396.  
  4397. '
  4398. ' *****************************************************************************
  4399. ' *  GET DRIVE ID AND FILENAME EXTENTION                                      *
  4400. ' *****************************************************************************
  4401. '
  4402. 20285 OK = FALSE
  4403.       K = 0
  4404.       L = LEN(A$)
  4405. 20286 K = K + 1
  4406.       IF K > L THEN _
  4407.          GOTO 20288
  4408.       B$ = MID$(Z$,K,1)
  4409.       IF B$ = "*" THEN _
  4410.          RETURN
  4411. 20287 IF B$ <> "?" AND MID$(A$,K,1) <> B$ THEN _
  4412.          OK = TRUE : _
  4413.          RETURN
  4414.       GOTO 20286
  4415. 20288 IF L < LEN(Z$) AND MID$(Z$,L + 1,1) <> "*" THEN _
  4416.          OK = TRUE
  4417.       RETURN
  4418. '
  4419. ' *****************************************************************************
  4420. ' *  XMODEM DOWNLOAD DRIVER                                                   *
  4421. ' *****************************************************************************
  4422. '
  4423. 20290 BLOCK.SIZE = 1
  4424.       IF USE.EXTERNAL.XMODEM THEN _
  4425.          GOTO 20261
  4426.       GOSUB 20750
  4427.       A1$ = "SEND"
  4428.       GOSUB 20320
  4429.       IF AUTODOWNLOAD.IN.PROGRESS THEN _
  4430.          CALL SENDNAME : _
  4431.          IF ABORT THEN _
  4432.             RETURN 20792
  4433.       GOSUB 21300
  4434.       A$ = ""
  4435.       GOTO 20390
  4436. 20320 IF NOT EIGHT.BIT THEN _
  4437.          A$ = "Please SWITCH to N,8,1 for binary transfer" : _
  4438.          GOSUB 12975 : _
  4439.          CALL DELAYIT (3)
  4440. 20325 XMODEM.TYPE$ = " ": _
  4441.       NEGATIVE.ACKNOWLEDGE$ = CHR$(21): _
  4442.       SOL = 132
  4443.       IF FT$ = "C" THEN _
  4444.          NEGATIVE.ACKNOWLEDGE$ = FT$: _
  4445.          SOL = 133: _
  4446.          XMODEM.TYPE$ = "/CRC "
  4447. 20330 IF AUTODOWNLOAD.IN.PROGRESS THEN _
  4448.          RETURN
  4449.       A$ = "XMODEM" + _
  4450.             XMODEM.TYPE$ + _
  4451.             A1$ + _
  4452.             " of " + _
  4453.             FILE.NAME.HOLD$ + _
  4454.             " ready.  <Ctrl X> aborts"
  4455.       GOSUB 12979
  4456.       RETURN
  4457. '
  4458. ' *****************************************************************************
  4459. ' *  ASCII DOWNLOAD DRIVER                                                    *
  4460. ' *****************************************************************************
  4461. '
  4462. 20340 IF DF THEN _
  4463.          A$ = "Switch to a non-ascii protocol" : _
  4464.          GOSUB 12979 : _
  4465.          RETURN
  4466.       CALL OPENWORK (FILE.NAME$)
  4467.       BLOCK.SIZE = 1
  4468.       GOSUB 20760
  4469.       A$ = "* <Ctrl X> aborts <Ctrl S> suspends *"
  4470.       GOSUB 12977
  4471.       A$ = "ASCII SEND of " + _
  4472.            FILE.NAME.HOLD$ + _
  4473.            " ready. Press [ENTER] to start"
  4474.       GOSUB 12995
  4475. 20380 STOP.INTERRUPTS = TRUE
  4476.       TU = 0
  4477.       SWAP TU,PAGE.LENGTH
  4478.       CALL BUFFILE (FILE.NAME$)
  4479.       SWAP TU,PAGE.LENGTH
  4480.       NON.STOP = (PAGE.LENGTH > 0) 'IS THIS CORRECT?
  4481.       IF STOP.FILE THEN _
  4482.          DOWNLOAD.COMPLETED = FALSE : _
  4483.          GOTO 20390
  4484. 20381 A$ = CHR$(26)
  4485.       GOSUB 12977
  4486.       CALL CARRIER
  4487.       IF NOT LOCAL.USER AND SUBROUTINE.PARAMETER = 0 THEN _
  4488.          FOR X = 1 TO 5 : _
  4489.            PRINT #3,CHR$(7) : _
  4490.            CALL DELAYIT (3) : _
  4491.          NEXT
  4492. 20385 DOWNLOAD.COMPLETED = TRUE
  4493. 20390 GOSUB 12977
  4494.       GOTO 50600
  4495. '
  4496. ' *****************************************************************************
  4497. ' *  U - COMMAND FROM FILES MENU (UPLOAD)                                     *
  4498. ' *****************************************************************************
  4499. '
  4500. 20395 GOSUB 12977
  4501.       A$ = "Correct name of file to upload"
  4502.       GOSUB 12995
  4503.       IF Q = 0 THEN _
  4504.          RETURN
  4505.       B$(ANS.INDEX) = B$(1)
  4506.       GOTO 20435
  4507. 20400 CALL TIMEREMAIN (TIME.REMAINING!)
  4508.       Q! = TCA!
  4509.       FIRST.UPLOAD = 1
  4510.       IF Q > 1 THEN _
  4511.          FIRST.UPLOAD = 2 : _
  4512.          GOTO 20430
  4513. 20420 A$ = "Name file(s) to upload"
  4514.       GOSUB 12995
  4515.       IF Q = 0 THEN _
  4516.          RETURN
  4517. '
  4518. ' *****************************************************************************
  4519. ' *  SEARCH FOR DUPLICATE FILENAME                                            *
  4520. ' *****************************************************************************
  4521. '
  4522. 20430 LAST.UPLOAD = Q
  4523.       Z$ = B$(LAST.UPLOAD)
  4524.       IF LEN(Z$) = 1 THEN _
  4525.         CALL ALLCAPS (Z$): _
  4526.         IF INSTR("AXCKYIGW ",Z$) > 0 THEN _
  4527.           LAST.UPLOAD = LAST.UPLOAD - 1:_
  4528.           COMMAND.TRANSFER$ = Z$
  4529.       FOR ANS.INDEX = FIRST.UPLOAD TO LAST.UPLOAD
  4530.         GOSUB 20435
  4531.       NEXT
  4532.       COMMAND.TRANSFER$ = ""
  4533.       RETURN
  4534. 20435 CALL QTPUT ("Searching for file...",1)
  4535.       FILE.NAME.HOLD$ = B$(ANS.INDEX)
  4536.       CALL ALLCAPS(FILE.NAME.HOLD$)
  4537.       FILE.NAME$ = FILE.NAME.HOLD$
  4538.       VIOLATION$ = "Upload "
  4539.       IF INSTR(FILE.NAME$,":") OR _
  4540.          INSTR(FILE.NAME$,"\") OR _
  4541.          INSTR(FILE.NAME$,"/") THEN _
  4542.          GOTO 20451
  4543.       CALL BADFILE (FILE.NAME$,BAD.FILE.NAME.INDEX)
  4544.       ON BAD.FILE.NAME.INDEX GOTO 20440,20451,20515
  4545. 20440 CALL ROTORSDIR (FILE.NAME$,SUBDIR$(),SUBDIR.COUNT)
  4546. 20450   IF OK THEN _
  4547.            GOTO 20452
  4548.         GOTO 20475
  4549. 20451   A$ = "Invalid file name"
  4550.         GOTO 20395
  4551. 20452   IF USER.SECURITY.LEVEL >= OVERWRITE.SECURITY.LEVEL THEN _
  4552.            A$ = "Overwrite file" : _
  4553.            GOSUB 12995 : _
  4554.            IF YES THEN _
  4555.               Z$ = FILE.NAME$ : _
  4556.               CLOSE 2 : _
  4557.               KILL FILE.NAME$ : _
  4558.               GOTO 20475
  4559. 20453   CLOSE 2
  4560.         A$ = FILE.NAME.HOLD$ + " exists! Please use a new name"
  4561.         GOTO 20395
  4562. 20475 Z$ = UPLOAD.DRIVE.FILE$
  4563.       GOSUB 12977
  4564.       CALL FINDFREE
  4565.       IF VAL(FREE.SPACE$) < 4096 THEN _
  4566.          GOSUB 13417: _
  4567.          ANS.INDEX = LAST.UPLOAD + 1:_
  4568.          RETURN
  4569.       A$ = "Upload disk has" + FREE.SPACE$
  4570.       GOSUB 12977
  4571.       LINE.25$ = "(U) " + FILE.NAME.HOLD$
  4572.       SUBROUTINE.PARAMETER = 2
  4573.       CALL LINE25
  4574.       A$ = ""
  4575.       OK = TRUE
  4576. 20477 GOSUB 21620
  4577.       IF FF THEN _
  4578.          GOTO 20500
  4579.       GOSUB 21600
  4580. 20500 TRANSFER.FUNCTION = 2
  4581.       ON FF GOTO 20560, _      ' ASCII FILE UPLOAD
  4582.                  20540, _      ' XMODEM (CHECKSUM) FILE UPLOAD
  4583.                  20540, _      ' XMODEM (CRC-16) FILE UPLOAD
  4584.                  20265, _      ' KERMIT FILE UPLOAD
  4585.                  20261, _      ' YMODEM FILE UPLOAD
  4586.                  20261, _      ' IMODEM FILE UPLOAD
  4587.                  20261, _      ' YMODEMG FILE UPLOAD
  4588.                  20261, _      ' WXMODEM FILE UPLOAD
  4589.                  20735         ' NO FILE UPLOAD
  4590. 20510 IF SNOOP THEN _
  4591.          PRINT "<Esc> by SYSOP aborts"
  4592.       RETURN
  4593. 20515 GOSUB 1380
  4594.       RETURN 20420
  4595. '
  4596. ' *****************************************************************************
  4597. ' *  XMODEM UPLOAD DRIVER                                                     *
  4598. ' *****************************************************************************
  4599. '
  4600. 20540 IF USE.EXTERNAL.XMODEM THEN _
  4601.          GOTO 20261
  4602.       A1$ = "RECEIVE"
  4603.       GOSUB 20320
  4604.       OK = TRUE
  4605.       GOSUB 20860
  4606.       IF OK THEN _
  4607.          GOTO 20700
  4608.       GOTO 20730
  4609. '
  4610. ' *****************************************************************************
  4611. ' *  ASCII UPLOAD                                                             *
  4612. ' *****************************************************************************
  4613. '
  4614. 20560 CALL QTPUT("Transfer MUST end with a <Ctrl-K>",1)
  4615.       CALL QTPUT("ASCII RECEIVE of " + FILE.NAME.HOLD$ + " ready",1)
  4616.       OK = FALSE
  4617.       XOFF = FALSE
  4618.       CLOSE 2
  4619.       OPEN "O",2,FILE.NAME$
  4620.       GOSUB 20510
  4621. 20600 WHILE NOT EOF(3)
  4622.         CALL CARRIER
  4623.         IF SUBROUTINE.PARAMETER THEN _
  4624.            GOTO 10595
  4625.         IF LOF(3) < 512 THEN _
  4626.            PRINT #3,XOFF$; : _
  4627.            XOFF = TRUE
  4628. 20610   X$ = INPUT$(LOC(3),3)
  4629.         IF INSTR(X$,CHR$(11)) THEN _
  4630.            GOTO 20650
  4631.         OK = TRUE
  4632. 20620   PRINT #2,X$;
  4633.         IF SNOOP THEN _
  4634.            PRINT X$;
  4635. 20621   GOSUB 60000
  4636.         IF KEY.PRESSED$ = ESCAPE$ THEN _
  4637.            GOTO 20745
  4638.         IF NOT OK THEN _
  4639.            GOTO 20670
  4640. 20630 WEND
  4641.       CALL CARRIER
  4642.       IF SUBROUTINE.PARAMETER THEN _
  4643.          GOTO 10595
  4644.       IF XOFF THEN _
  4645.          XOFF = FALSE : _
  4646.          PRINT #3,XON$;
  4647.       GOTO 20600
  4648. 20650 X = INSTR(X$,CHR$(11))
  4649.       IF X <> 1 THEN _
  4650.          PRINT #2,LEFT$(X$,X-1) _
  4651.       ELSE IF NOT OK THEN _
  4652.               GOTO 20730
  4653.       GOTO 20700
  4654. 20670 A$ = XOFF$ + "System error! Upload aborted <Ctrl-K> continues"
  4655. 20675 GOSUB 12979
  4656.       CALL DELAYIT (3)
  4657.       CALL CARRIER
  4658.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4659.          PRINT #3,XON$;
  4660. 20680 WHILE NOT EOF(3)
  4661.         X$ = INPUT$(LOC(3),3)
  4662.         IF INSTR(X$,CHR$(11)) THEN _
  4663.            GOTO 20730
  4664. 20685   CALL CARRIER
  4665.         IF SUBROUTINE.PARAMETER = -1 THEN _
  4666.            GOTO 10595
  4667.       WEND
  4668.       GOTO 20680
  4669. '
  4670. ' *****************************************************************************
  4671. ' *  UPDATE UPLOAD DIRECTORY                                                  *
  4672. ' *****************************************************************************
  4673. '
  4674. 20700 CALL UPDTUPLOAD (CATEGORY.NAME$(),CATEGORY.CODE$())
  4675.       IF BYTES.IN.FILE# > 0.0 THEN _
  4676.          GOTO 50610
  4677. 20730 CALL QTPUT ("Upload aborted",1)
  4678. 20735 CLOSE 2
  4679. 20736 KILL FILE.NAME$
  4680.       RETURN
  4681. '
  4682. ' *****************************************************************************
  4683. ' *  SYSOP ABORTED UPLOAD                                                     *
  4684. ' *****************************************************************************
  4685. '
  4686. 20745 A$ = XOFF$ + "SYSOP aborted upload. Stop tranfer. <Ctrl-K> continues"
  4687.       GOTO 20675
  4688. '
  4689. ' *****************************************************************************
  4690. ' *  CALCULATE DOWNLOAD TIME ESTIMATE                                         *
  4691. ' *****************************************************************************
  4692. '
  4693. 20750 CLOSE 2
  4694.       IF SHARE.IT THEN _
  4695.          OPEN FILE.NAME$ FOR RANDOM SHARED AS #2 _
  4696.       ELSE OPEN "R",2,FILE.NAME$,128
  4697. 20760 BYTES.IN.FILE# = LOF(2)
  4698.       IX# = FIX(BYTES.IN.FILE# / 128)
  4699.       BLOCKS.IN.FILE# = BYTES.IN.FILE# / 128
  4700.       IF IX# <> BLOCKS.IN.FILE# THEN _
  4701.          BLOCKS.IN.FILE# = BLOCKS.IN.FILE# + 1
  4702. 20780 A$ = "FILE SIZE: "
  4703.       IF FF = 4 OR FF = 8 THEN _
  4704.          GOTO 20785
  4705.       A$ = A$ + STR$(INT((BLOCKS.IN.FILE# / BLOCK.SIZE)+.5) + (-1*(FF>4))) + _
  4706.             " blocks "
  4707. 20785 A$ = A$ + STR$(BYTES.IN.FILE#) + " bytes"
  4708.       GOSUB 12979
  4709.       TLA = VAL(MID$("139165165165165142135165",3*FF-2,3))
  4710.       BLOCKS.IN.FILE# = BLOCKS.IN.FILE# * _
  4711.                         TLA / _
  4712.                         VAL(MID$("00030045120240480960",-3*BPS,3))
  4713.       IF BYTES.IN.FILE# < 1 THEN _
  4714.          RETURN 20792
  4715. 20790 SUBROUTINE.PARAMETER = 2
  4716.       CALL LINE25
  4717.       A$ = "Transfer time:" + _
  4718.          STR$(INT(BLOCKS.IN.FILE# / 60)) + " min," + _
  4719.          STR$(INT(BLOCKS.IN.FILE#-(INT(BLOCKS.IN.FILE#/60)*60))) + _
  4720.          " sec"
  4721.       GOSUB 12979
  4722.       GOSUB 41000
  4723.       IF (INT(BLOCKS.IN.FILE# / 60) + 1) > INT(TIME.REMAINING!) THEN _
  4724.          A$ = "Not enough time left!" : _
  4725.          CALL UPDTCALR (FILE.NAME$ + " " + A$,2) :_
  4726.          CALL QTPUT (A$,1): _
  4727.          A$ = "" : _
  4728.          RETURN 20792
  4729. 20792 RETURN
  4730. 20810 CALL CARRIER
  4731.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4732.          GOTO 10595
  4733.       Y$ = ""
  4734.       CALL FINDTIME(DELAY!)
  4735.       DELAY! = DELAY! + 2
  4736. 20840 IF NOT EOF(3) THEN _
  4737.          Y$ = INPUT$(LOC(3),3) : _
  4738.          RETURN
  4739. 20850 CALL CHECKTIM (DELAY!)
  4740.       ON SUBROUTINE.PARAMETER GOTO 20840,20851
  4741. 20851 Y$ = ""
  4742.       RETURN
  4743. '
  4744. ' *****************************************************************************
  4745. ' *  XMODEM UPLOAD                                                            *
  4746. ' *****************************************************************************
  4747. '
  4748. 20860 GOSUB 20992
  4749.       IF NOT EIGHT.BIT THEN _
  4750.          GOSUB 21280
  4751. 20900 X$ = ""
  4752.       SEC = 1
  4753.       CLOSE 2
  4754.       OPEN "R",2,FILE.NAME$,128
  4755.       FIELD 2,128 AS Z$
  4756.       CALL CARRIER
  4757.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4758.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4759.       CALL FINDTIME (TRANSFER.ABORT!)
  4760.       TRANSFER.ABORT! = TRANSFER.ABORT! + WAIT.BEFORE.DISCONNECT
  4761. 20920 FOR X = 1 TO 5
  4762.         GOSUB 60000
  4763.         IF KEY.PRESSED$ = ESCAPE$ THEN _
  4764.            GOTO 21270
  4765.         GOSUB 20810
  4766. 20930   IF LEFT$(Y$,1) = START.OF.HEADER$ THEN _
  4767.            GOTO 21020
  4768. 20940   IF LEFT$(Y$,1) = END.TRANSMISSION$ THEN _
  4769.            GOTO 21220
  4770. 20950   IF LEFT$(Y$,1) = CANCEL$ THEN _
  4771.            GOTO 21230
  4772. 20960   IF Y$ <> "" THEN _
  4773.            GOSUB 21280 : _
  4774.            CALL CHECKTIM (TRANSFER.ABORT!) : _
  4775.            ON SUBROUTINE.PARAMETER GOTO 20920,21230
  4776. 20970 NEXT
  4777.       CALL CARRIER
  4778.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4779.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4780.       IF SNOOP THEN _
  4781.          PRINT "Upload Timeout"
  4782.       CALL CHECKTIM (TRANSFER.ABORT!)
  4783.       ON SUBROUTINE.PARAMETER GOTO 20990,21230
  4784. 20990 GOTO 20920
  4785. '
  4786. ' *****************************************************************************
  4787. ' *  CHANGE TO 8 BIT FOR XMODEM                                               *
  4788. ' *****************************************************************************
  4789. '
  4790. 20992 GOSUB 20510
  4791.       IF NOT EIGHT.BIT THEN _
  4792.          CALL DELAYIT (3) : _
  4793.          OUT LINE.CONTROL.REGISTER,3
  4794. 20996 SO = 0
  4795.       RETURN
  4796. '
  4797. ' *****************************************************************************
  4798. ' *  XMODEM UPLOAD                                                            *
  4799. ' *****************************************************************************
  4800. '
  4801. 21000 GOSUB 20810
  4802.       IF Y$ = "" THEN _
  4803.          PRINT "Upload Timeout" : _
  4804.          GOTO 21040
  4805. 21020 X$ = X$ + Y$
  4806.       IF LEN(X$) < SOL THEN _
  4807.          GOTO 21000
  4808. 21040 IF LEN(X$) = SOL THEN _
  4809.          GOTO 21090
  4810. 21050 IF LEN(X$) > SOL THEN _
  4811.          GOTO 21180
  4812. 21060 IF X$ = END.TRANSMISSION$ THEN _
  4813.          GOTO 21220
  4814. 21070 IF X$ = CANCEL$ THEN _
  4815.          GOTO 21230
  4816. 21080 GOTO 21170
  4817. 21090 IF SEC <> ASC(MID$(X$,2,1)) THEN _
  4818.          GOTO 21200
  4819. 21100 IF (SEC XOR 255) <> ASC(MID$(X$,3,1)) THEN _
  4820.          GOTO 21210
  4821. 21110 IF FT$ = "X" THEN _
  4822.          WK$ = MID$(X$,4,128): _
  4823.          GOSUB 46000 _
  4824.       ELSE WK$ = MID$(X$,4): _
  4825.            GOSUB 46000
  4826. 21112 IF FT$ = "X" THEN _
  4827.          IF XMODEM.CHECKSUM <> ASC(MID$(X$,132,1)) THEN _
  4828.             GOTO 21190 _
  4829.          ELSE GOTO 21120
  4830. 21113 IF CRC.VALUE <> 0 THEN _
  4831.          GOTO 21191
  4832. 21120 SO = SO + 1
  4833.       CALL CARRIER
  4834.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4835.          PRINT #3,ACKNOWLEDGE$;
  4836. 21131 LSET Z$ = MID$(X$,4)
  4837.       PUT 2
  4838. 21145 SEC = 255 AND (SEC + 1)
  4839.       IF SNOOP THEN _
  4840.          LOCATE ,1 : _
  4841.          PRINT "OK Rec Blk #";SO;
  4842. 21150 X$=""
  4843.       XMODEM.CHECKSUM = 0
  4844.       CALL FINDTIME(TRANSFER.ABORT!)
  4845.       TRANSFER.ABORT! = TRANSFER.ABORT! + 30
  4846.       GOTO 20920
  4847. 21170 A$ = "Short Blk #"
  4848.       GOTO 21212
  4849. 21180 A$ = "Long Blk #"
  4850.       GOTO 21212
  4851. 21190 A$ = "Chksum Error #"
  4852.       GOTO 21212
  4853. 21191 A$="CRC Error": _
  4854.       GOTO 21212
  4855. 21200 A$ = "Blk # Error in #"
  4856.       IF SEC-1 <> ASC(MID$(X$,2,1)) THEN _
  4857.          GOTO 21212
  4858.       CALL CARRIER
  4859.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4860.          PRINT #3,ACKNOWLEDGE$;
  4861.       GOTO 21150
  4862. 21210 A$ = "Complement Error in #"
  4863. 21212 CALL CARRIER
  4864.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4865.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4866.       IF SNOOP THEN _
  4867.          PRINT LINE.FEED$;A$;SO + 1
  4868.       GOTO 21150
  4869. 21220 IF SNOOP THEN _
  4870.          PRINT LINE.FEED$;"File Closed"
  4871. 21225 CALL CARRIER
  4872.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4873.          PRINT #3,ACKNOWLEDGE$;
  4874.       GOTO 21250
  4875. 21230 IF SNOOP THEN _
  4876.          PRINT LINE.FEED$;"Transfer Aborted"
  4877. 21240 OK = FALSE
  4878.       CALL CARRIER
  4879.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4880.          PRINT #3,CANCEL$;CANCEL$;
  4881. 21250 EIGHT.BIT = TRUE
  4882.       RETURN
  4883. 21270 GOSUB 20510
  4884.       GOSUB 21280
  4885.       GOTO 21230
  4886. '
  4887. ' *****************************************************************************
  4888. ' *  CLEAR GARBAGE OUT OF COMMUNICATIONS BUFFER                               *
  4889. ' *****************************************************************************
  4890. '
  4891. 21280 IF EOF(3) THEN _
  4892.          RETURN
  4893.       CALL CARRIER
  4894.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4895.          GOTO 10595
  4896. 21281 DF$ = INPUT$(LOC(3),3)
  4897.       GOTO 21280
  4898.       RETURN
  4899. '
  4900. ' *****************************************************************************
  4901. ' *  XMODEM DOWNLOAD                                                          *
  4902. ' *****************************************************************************
  4903. '
  4904. 21300 GOSUB 20992
  4905.       SEC = 0
  4906.       GOSUB 21280
  4907.       FIELD 2,128 AS X$
  4908.       NEGATIVE.ACKNOWLEDGE$=CHR$(21)
  4909.       CALL FINDTIME (TRANSFER.ABORT!)
  4910.       TRANSFER.ABORT! = TRANSFER.ABORT! + WAIT.BEFORE.DISCONNECT
  4911. 21350 WHILE NOT EOF(3)
  4912. 21360   Y$ = INPUT$(1,3)
  4913.         IF Y$ = CANCEL$ THEN _
  4914.            GOTO 21560
  4915. 21380   IF Y$ = NEGATIVE.ACKNOWLEDGE$ THEN _
  4916.            FF = 3: _
  4917.            FT$ = "X": _
  4918.            GOTO 21480 _
  4919.         ELSE IF Y$ = "C" THEN _
  4920.                 FF = 4: _
  4921.                 FT$ = "C": _
  4922.                 GOTO 21480
  4923. 21390 WEND
  4924.       GOSUB 21460
  4925.       CALL CHECKTIM (TRANSFER.ABORT!)
  4926.       ON SUBROUTINE.PARAMETER GOTO 21350,21455
  4927. 21410 CALL FINDTIME (TI!)
  4928.       TRANSFER.ABORT! = TI! + WAIT.BEFORE.DISCONNECT
  4929. 21415 WHILE NOT EOF(3)
  4930. 21420   Y$ = INPUT$(1,3)
  4931.         IF Y$ = ACKNOWLEDGE$ THEN _
  4932.            GOTO 21470
  4933. 21440   IF Y$ <> NEGATIVE.ACKNOWLEDGE$ THEN _
  4934.            GOTO 21450
  4935. 21443   IF SNOOP THEN _
  4936.            PRINT LINE.FEED$;"Error -> retrans #";SO
  4937. 21445   SO = SO-1
  4938.         GOTO 21490
  4939. 21450   IF Y$ = CANCEL$ THEN _
  4940.            GOTO 21560
  4941.         CALL CHECKTIM (TRANSFER.ABORT!)
  4942.         ON SUBROUTINE.PARAMETER GOTO 21451,21455
  4943. 21451 WEND
  4944.       GOSUB 21460
  4945.       CALL CHECKTIM (TRANSFER.ABORT!)
  4946.       ON SUBROUTINE.PARAMETER GOTO 21410,21455
  4947. 21455 IF SNOOP THEN _
  4948.          PRINT "Download timeout"
  4949.       GOTO 21560
  4950. 21460 CALL CARRIER
  4951.       IF SUBROUTINE.PARAMETER = -1 THEN _
  4952.          GOTO 10595
  4953.       GOSUB 60000
  4954.       IF KEY.PRESSED$ = ESCAPE$ THEN _
  4955.          RETURN 21540
  4956.       RETURN
  4957. 21470 IF SNOOP THEN _
  4958.          LOCATE ,1 : PRINT "OK Sent Blk #";SO;
  4959. 21480 IF LOC(2) < LOF(2) / 128 THEN _
  4960.          GET 2,(LOC(2) + 1) : _
  4961.          SEC = 255 AND (SEC + 1) : _
  4962.          GOTO 21490
  4963. 21485 GOTO 21530
  4964. 21490 SO = SO + 1
  4965.       CALL CARRIER
  4966.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4967.          PRINT #3,START.OF.HEADER$; CHR$(SEC); CHR$(SEC XOR 255);X$;
  4968. 21503 WK$=X$
  4969. 21504 GOSUB 46000
  4970. 21510 CALL CARRIER
  4971.       IF FT$ = "X" AND SUBROUTINE.PARAMETER = 0 THEN _
  4972.          PRINT#3,CHR$(XMODEM.CHECKSUM); _
  4973.       ELSE IF SUBROUTINE.PARAMETER = 0 THEN _
  4974.               PRINT#3,CHR$(CRC.HIGH);CHR$(CRC.LOW);
  4975.       GOSUB 21280
  4976.       GOTO 21410
  4977. '
  4978. ' *****************************************************************************
  4979. ' *  END-OF-FILE FOR XMODEM DOWNLOADS -- SEND THE "EOT" CHARACTER AND WAIT UP *
  4980. ' *  TO 2 SECONDS FOR A POSITIVE RESPONSE (I.E. AN "ACK").  IF NONE IS        *
  4981. ' *  RE-TRY UP TO 10 TIMES.  IF NO POSITIVE RESPONSE IS RECEIVED AFTER TEN    *
  4982. ' *  ATTEMPTS, ASSUME THE DOWNLOAD WAS UNSUCCESSFULL.                         *
  4983. ' *****************************************************************************
  4984. '
  4985. 21530 CALL CARRIER
  4986.       IF SUBROUTINE.PARAMETER = 0 THEN _
  4987.          PRINT #3,END.TRANSMISSION$;
  4988.       FOR X = 1 TO 10
  4989.           GOSUB 20810
  4990.           IF INSTR(Y$,ACKNOWLEDGE$) THEN _
  4991.              GOTO 21550
  4992.           GOSUB 60000
  4993.           IF KEY.PRESSED$ = ESCAPE$ THEN _
  4994.              GOTO 21540
  4995. 21535 NEXT
  4996.       DOWNLOAD.COMPLETED = FALSE
  4997.       GOTO 21230
  4998. 21540 GOSUB 20510
  4999. 21545 Y$ = CANCEL$
  5000.       CALL CARRIER
  5001.       IF SUBROUTINE.PARAMETER = 0 THEN _
  5002.          PRINT #3,CANCEL$;CANCEL$;
  5003.       DOWNLOAD.COMPLETED = FALSE
  5004.       GOTO 21250
  5005. 21550 DOWNLOAD.COMPLETED = TRUE
  5006.       GOTO 21250
  5007. 21560 DOWNLOAD.COMPLETED = FALSE
  5008.       IF SNOOP THEN _
  5009.          PRINT LINE.FEED$;"Caller aborted trans"
  5010.       GOTO 21545
  5011. '
  5012. ' *****************************************************************************
  5013. ' *  MANUAL SELECT OF TRANSFER PROTOCOL                                       *
  5014. ' *****************************************************************************
  5015. '
  5016. 21600 CR = 0
  5017.       A$ = A$ + "Protocol:"
  5018.       GOSUB 12975
  5019.       A$ = TRANSFER.OPTIONS$
  5020.       GOSUB 12995
  5021.       IF Q = 0 THEN _
  5022.          GOTO 21600
  5023.       Z$ = B$(1)
  5024. '
  5025. ' *****************************************************************************
  5026. ' *  DEFAULT SELECT OF TRANSFER PROTOCOL                                      *
  5027. ' *****************************************************************************
  5028. '
  5029. 21610 CALL ALLCAPS (Z$)
  5030.       FF = INSTR("AXCKYIGWN",Z$)
  5031.       IF FF < 1 THEN _
  5032.          GOTO 21600
  5033.       IF FF = 4 AND NOT KERMIT.SUPPORT THEN _
  5034.          GOTO 21600
  5035.       IF (FF > 4 AND FF < 8) AND NOT XFER.SUPPORT THEN _
  5036.          GOTO 21600
  5037.       IF FF = 6 AND NOT RELIABLE.MODE THEN _
  5038.          GOTO 21600
  5039.       IF FF = 7 AND NOT RELIABLE.MODE THEN _
  5040.          GOTO 21600
  5041.       IF FF = 8 AND NOT WXMODEM.SUPPORT THEN _
  5042.          GOTO 21600
  5043.       FT$ = MID$("AXCKYIGW ",FF,1)
  5044.       RETURN
  5045. 21620 FF = -1
  5046.       IF COMMAND.TRANSFER$ <> "" THEN _
  5047.          Z$ = COMMAND.TRANSFER$ : _
  5048.          GOTO 21610
  5049.       IF USER.TRANSFER.DEFAULT$ > " " THEN _
  5050.          Z$ = USER.TRANSFER.DEFAULT$ : _
  5051.          GOTO 21610
  5052.       FF = 0
  5053.       RETURN
  5054. '
  5055. ' *****************************************************************************
  5056. ' *  GET MESSAGE HEADER RECORD DATA                                           *
  5057. ' *****************************************************************************
  5058. '
  5059. 23000 GET 1,1
  5060.       HIGH.MESSAGE.NUMBER = VAL(LEFT$(MESSAGE.RECORD$,8))
  5061.       CALLS.TODATE! = VAL(MID$(MESSAGE.RECORD$,11,10))
  5062.       CURRENT.USER.COUNT = VAL(MID$(MESSAGE.RECORD$,57,5))
  5063.       HIGHEST.USER.RECORD = VAL(MID$(MESSAGE.RECORD$,62,5))
  5064.       FIRST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,68,7))
  5065.       NEXT.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,75,7))
  5066.       HIGHEST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,82,7))
  5067.       NODES.IN.SYSTEM = VAL(MID$(MESSAGE.RECORD$,127))
  5068.       IF NOT SYSOP AND NOT LOCAL.USER THEN _
  5069.          RETURN
  5070.       IF TEMP.SYSOP OR LOCAL.USER.MODE THEN _
  5071.          RETURN
  5072.       IF LAST.MESSAGE.READ < VAL(MID$(MESSAGE.RECORD$,123,4)) THEN _
  5073.          LAST.MESSAGE.READ = VAL(MID$(MESSAGE.RECORD$,123,4))
  5074.       LAST.MESSAGE.READ = - LAST.MESSAGE.READ * _
  5075.                       (LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  5076.       RETURN
  5077. '
  5078. '
  5079. ' *****************************************************************************
  5080. ' *  UPDATE MESSAGE HEADER RECORD DATA                                        *
  5081. ' *****************************************************************************
  5082. '
  5083. 24000 MID$(MESSAGE.RECORD$,1,8) = STR$(HIGH.MESSAGE.NUMBER)
  5084.       MID$(MESSAGE.RECORD$,11,10) = STR$(CALLS.TODATE!)
  5085.       MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)
  5086.       MID$(MESSAGE.RECORD$,62,5) = STR$(HIGHEST.USER.RECORD)
  5087.       MID$(MESSAGE.RECORD$,68,7) = STR$(FIRST.MESSAGE.RECORD)
  5088.       MID$(MESSAGE.RECORD$,75,7) = STR$(NEXT.MESSAGE.RECORD)
  5089.       MID$(MESSAGE.RECORD$,82,7) = STR$(HIGHEST.MESSAGE.RECORD)
  5090.       PUT 1,1
  5091.       RETURN
  5092. '
  5093. ' *****************************************************************************
  5094. ' * F1 - COMMAND FROM LOCAL KEYBOARD (IMMEDIATE EXIT TO DOS)                  *
  5095. ' *****************************************************************************
  5096. '
  5097. 31000 FILE.NAME$ = LEFT$(CALLERS.FILE$,2) + _
  5098.                    "RBBS" + _
  5099.                    MID$("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ", _
  5100.                       VAL(NODE.ID$),1) + _
  5101.                    "F1.DEF"
  5102.       CLOSE 2
  5103.       OPEN "O",2,FILE.NAME$
  5104.       PRINT #2,MID$(FILE.NAME$,3,7)
  5105.       GOSUB 14498
  5106.       IF EXIT.TO.DOORS THEN _
  5107.          SYSTEM
  5108. 31005 CALL MLINIT (3)
  5109.       SYSTEM
  5110. '
  5111. ' *****************************************************************************
  5112. ' * F2 - COMMAND FROM LOCAL KEYBOARD (SYSOP EXIT TO DOS AND RETURN)           *
  5113. ' *****************************************************************************
  5114. '
  5115.  
  5116. 32000 IF NOT LOCAL.USER THEN _
  5117.          CALL QTPUT("Sysop exiting to DOS. Please wait...",1) : _
  5118.          FUNCTION.KEY = 0 : _
  5119.          CALL DELAYIT (3)
  5120.       SHELL DISK.FOR.DOS$+"COMMAND"
  5121.       CLS
  5122.       IF NOT LOCAL.USER THEN _
  5123.          CALL CARRIER : _
  5124.          IF SUBROUTINE.PARAMETER = -1 THEN _
  5125.             GOTO 10595 _
  5126.          ELSE SUBROUTINE.PARAMETER = 2 : _
  5127.               CALL LINE25 : _
  5128.               CALL QTPUT ("Sysop back from DOS.  Returning control to you.",2)
  5129.       RETURN
  5130. '
  5131. ' *****************************************************************************
  5132. ' * F3 - COMMAND FROM LOCAL KEYBOARD (PRINTER TOGGLE)                         *
  5133. ' *****************************************************************************
  5134. '
  5135. 33000 PRINTER = NOT PRINTER
  5136.       CHANGE.VALUE = PRINTER
  5137.       FIELD.POSITION = 38
  5138.       GOTO 33950
  5139. '
  5140. ' *****************************************************************************
  5141. ' * F4 - COMMAND FROM LOCAL KEYBOARD (SYSOP ANNOY)                            *
  5142. ' *****************************************************************************
  5143. '
  5144. 33040 SYSOP.ANNOY = NOT SYSOP.ANNOY
  5145.       CHANGE.VALUE = SYSOP.ANNOY
  5146.       FIELD.POSITION = 34
  5147.       GOTO 33950
  5148. '
  5149. ' *****************************************************************************
  5150. ' * F5 - COMMAND FROM LOCAL KEYBOARD (FORCE CALLER ONLINE)                    *
  5151. ' *****************************************************************************
  5152. '
  5153. 33060 FUNCTION.KEY = 0
  5154.       SUBROUTINE.PARAMETER = 4
  5155.       RETURN 200
  5156. '
  5157. ' *****************************************************************************
  5158. ' * F6 - COMMAND FROM LOCAL KEYBOARD (SYSOP AVAILABLE TOGGLE)                 *
  5159. ' *  6 - COMMAND FROM SYSOP MENU (SYSOP AVAILABLE TOGGLE)                     *
  5160. ' *****************************************************************************
  5161. '
  5162. 33070 SYSOP.AVAILABLE = NOT SYSOP.AVAILABLE
  5163.       CHANGE.VALUE = SYSOP.AVAILABLE
  5164.       FIELD.POSITION = 32
  5165.       GOTO 33950
  5166. '
  5167. ' *****************************************************************************
  5168. ' * F7 - COMMAND FROM LOCAL KEYBOARD (SYSOP GETS SYSTEM NEXT)                 *
  5169. ' *****************************************************************************
  5170. '
  5171. 33090 IF ERR=61 AND NOT DISKFULL.GO.OFFLINE THEN _
  5172.          RETURN
  5173.       SYSOP.NEXT = NOT SYSOP.NEXT
  5174.       CHANGE.VALUE = SYSOP.NEXT
  5175.       FIELD.POSITION = 36
  5176.       GOTO 33950
  5177. '
  5178. ' *****************************************************************************
  5179. ' * F8 - COMMAND FROM LOCAL KEYBOARD (ASSIGN USER TEMPORARY SYSOP SECURITY)   *
  5180. ' *****************************************************************************
  5181. '
  5182. 33110 SYSOP = NOT SYSOP
  5183.       CURSOR.LINE = CSRLIN
  5184.       CURSOR.ROW = POS(0)
  5185.       LOCATE 25,1
  5186.       PRINT SPACE$(79);
  5187.       LOCATE 25,1
  5188.       USER.SECURITY.LEVEL = (1 + SYSOP) * _
  5189.                             USER.SECURITY.SAVE  - _
  5190.                             SYSOP * _
  5191.                             SYSOP.SECURITY.LEVEL
  5192.       PRINT "Temp SYSOP Privileges "; MID$("OFFON",1-3*SYSOP,3);
  5193.       CALL DELAYIT (3)
  5194.       LOCATE CURSOR.LINE,CURSOR.ROW
  5195.       SUBROUTINE.PARAMETER = 1
  5196.       CALL LINE25
  5197.       CALL CALLOPT
  5198.       RETURN
  5199. '
  5200. ' *****************************************************************************
  5201. ' * F9 - COMMAND FROM LOCAL KEYBOARD (SNOOP TOGGLE)                           *
  5202. ' *****************************************************************************
  5203. '
  5204. 33130 IF NOT SNOOP THEN _
  5205.          SNOOP = TRUE : _
  5206.          LOCATE 24,1,0 : _
  5207.          PRINT "SNOOP ON"; : _
  5208.          SUBROUTINE.PARAMETER = 2 : _
  5209.          CALL LINE25 _
  5210.       ELSE LOCATE ,,0 : _
  5211.            SNOOP = FALSE : _
  5212.        CLS
  5213. 33140 CHANGE.VALUE = SNOOP
  5214.       FIELD.POSITION = 58
  5215.       GOTO 33950
  5216. '
  5217. ' *****************************************************************************
  5218. ' * F10 - COMMAND FROM LOCAL KEYBOARD (FORCE CHAT WITH USER)                  *
  5219. ' *****************************************************************************
  5220. '
  5221. 33150 IF CHAT.AVAILABLE = TRUE THEN _
  5222.          GOTO 33160
  5223.       CURSOR.LINE = CSRLIN
  5224.       CURSOR.ROW = POS(0)
  5225.       LOCATE 25,1
  5226.       PRINT SPACE$(79);
  5227.       LOCATE 25,1
  5228.       PRINT "CHAT not available now!";
  5229.       CALL DELAYIT (1)
  5230.       LOCATE CURSOR.LINE,CURSOR.ROW
  5231.       SUBROUTINE.PARAMETER = 1
  5232.       CALL LINE25
  5233.       RETURN
  5234. 33160 CALL UPDTCALR ("Sysop began chat",1)
  5235.       CALL SKIPLINE (1)
  5236.       CALL QTPUT ("Hi " + _
  5237.            FIRST.NAME$ + _
  5238.            ", this is " + _
  5239.            SYSOP.FIRST.NAME$ + _
  5240.            " " + _
  5241.            SYSOP.LAST.NAME$ + _
  5242.            "  Sorry to break in to CHAT but..",1)
  5243.       FUNCTION.KEY = 0
  5244.       GOTO 4770
  5245. '
  5246. ' *****************************************************************************
  5247. ' * PGUP DISPLAY USER PROFILE                                                 *
  5248. ' *****************************************************************************
  5249. '
  5250. 33200 CALL CARRIER
  5251.       IF SUBROUTINE.PARAMETER = -1 THEN _
  5252.          RETURN
  5253.       USER.DATA = TRUE
  5254.       PRINT
  5255.       PRINT "USER NAME: ";ACTIVE.USER.NAME$
  5256.       PRINT "SECURITY :";STR$(USER.SECURITY.SAVE)
  5257.       PRINT "PASSWORD :";PASSWORD.SAVE$
  5258.       PRINT "READ MSG.:";STR$(LAST.MESSAGE.READ)
  5259.       PRINT "TIMES ON :";STR$(TIMES.LOGGED.ON)
  5260.       PRINT "LAST ON  :";LAST.DATE.TIME.ON.SAVE$
  5261.       PRINT "DOWNLOADS:";STR$(DOWNLOADS)
  5262.       PRINT "UPLOADS  :";STR$(UPLOADS)
  5263.       PRINT "User's Profile"
  5264.       GOSUB 5410
  5265.       USER.DATA = FALSE
  5266.       RETURN
  5267. '
  5268. ' *****************************************************************************
  5269. ' * UPDATE NODE RECORD WITH LOCAL FUNCTION KEY ACTIVITY                       *
  5270. ' *****************************************************************************
  5271. '
  5272. 33950 IF SNOOP THEN _
  5273.          SUBROUTINE.PARAMETER = 1 : _
  5274.          CALL LINE25
  5275. 33960 IF CONFERENCE.MODE = FALSE THEN _
  5276.          GOSUB 12986 : _
  5277.          CALL OPENMSG : _
  5278.          IF EC = 64 THEN _
  5279.             EC = 0 : _
  5280.             GOTO 5360 _
  5281.          ELSE FIELD 1, 128 AS MESSAGE.RECORD$ : _
  5282.          GET 1,NODE.RECORD.INDEX : _
  5283.          MID$(MESSAGE.RECORD$,FIELD.POSITION,2) = STR$(CHANGE.VALUE) : _
  5284.          CALL SAVEPROF (2) : _
  5285.          FIELD 1, 128 AS MESSAGE.RECORD$ : _
  5286.          RETURN
  5287. 33970 PRINT "Cannot change status during Conference!"
  5288.       RETURN
  5289. '
  5290. ' *****************************************************************************
  5291. ' * CALCULATE TIME REMAINING FOR USER                                         *
  5292. ' *****************************************************************************
  5293. '
  5294. 41000 CALL TIMEREMAIN (TIME.REMAINING!)
  5295.       IF BYPASS.TIME.CHECK THEN _
  5296.          RETURN
  5297.       IF TIME.REMAINING! < 0.1 THEN _
  5298.          RETURN 10553
  5299.       RETURN
  5300. '
  5301. ' *****************************************************************************
  5302. ' * SHOW USER CURRENT ACCESS LEVEL                                            *
  5303. ' *****************************************************************************
  5304. '
  5305. 41070 A$ = "Granted access level" + _
  5306.            STR$(USER.SECURITY.LEVEL) + _
  5307.            MID$(" (SYSOP)",1,-8*(USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL))
  5308.       GOSUB 12975
  5309.       RETURN
  5310. '
  5311. ' *****************************************************************************
  5312. ' * NULLS SET FOR NEW USERS                                                   *
  5313. ' *****************************************************************************
  5314. '
  5315. 42700 A$ = "Want nulls (for printing terminal) (Y/N)"
  5316.       GOSUB 12995
  5317.       IF NO OR YES THEN _
  5318.          NULLS = NO _
  5319.       ELSE GOTO 42700
  5320. '
  5321. ' *****************************************************************************
  5322. ' *  N - COMMAND FROM UTILITY MENU (NULLS TOGGLE)                             *
  5323. ' *****************************************************************************
  5324. '
  5325. 42710 NULLS = NOT NULLS
  5326.       GOSUB 9520
  5327. 42720 A$ = "Nulls " + MID$("OffOn",1-3*NULLS,3)
  5328.       GOSUB 12979
  5329.       RETURN
  5330. '
  5331. ' *****************************************************************************
  5332. ' *  F - COMMAND FROM UTILITY MENU (FILE TRANSFER DEFALUT MODE)               *
  5333. ' *  FILE TRANSFER DEFAULT SET FOR NEW USERS                                  *
  5334. ' *****************************************************************************
  5335. '
  5336. 42800 A$ = "Default "
  5337.       GOSUB 21600
  5338.       USER.TRANSFER.DEFAULT$ = FT$
  5339. 42810 A$ = "PROTOCOL: " + _
  5340.            MID$("Ascii  Xmodem Xm/CRC Kermit Ymodem Imodem YmodemGWxmodemNone",7*FF-6,7)
  5341.       GOSUB 12979
  5342.       RETURN
  5343. '
  5344. ' *****************************************************************************
  5345. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE TOGGLE)                       *
  5346. ' *  UPPER/LOWER CASE SET FOR NEW USERS                                       *
  5347. ' *****************************************************************************
  5348. '
  5349. 42950 A$ = "CAN YOUR TERMINAL DISPLAY LOWER CASE (Y/N)"
  5350.       GOSUB 12995
  5351.       IF NO OR YES THEN _
  5352.          UPPER.CASE = YES _
  5353.       ELSE GOTO 42950
  5354. 42960 UPPER.CASE = NOT UPPER.CASE
  5355.       A$ = "UPPER CASE " + MID$("and lowerONLY",1-9*UPPER.CASE,9)
  5356.       GOSUB 12979
  5357.       RETURN
  5358. '
  5359. ' *****************************************************************************
  5360. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)                          *
  5361. ' *  GRAPHIC MENUS SELECTION SET FOR NEW USERS                                *
  5362. ' *****************************************************************************
  5363. '
  5364. 43000 IF NOT EIGHT.BIT THEN _
  5365.          CALL QTPUT("Graphics unavailable",1):_
  5366.          RETURN
  5367. 43005 IF EXPERT.USER THEN _
  5368.          GOTO 43007
  5369. 43006 FILE.NAME$ = HELP$(9)
  5370.       CALL BUFFILE (FILE.NAME$)
  5371.       CALL CARRIER
  5372.       IF SUBROUTINE.PARAMETER = -1 THEN _
  5373.          GOTO 10595
  5374. 43007 A$ = "GRAPHICS wanted: N)one, A)scii-IBM, C)olor-IBM, H)elp"
  5375.       GOSUB 12995
  5376.       IF Q = 0 THEN _
  5377.          GOTO 43007
  5378.       CALL ALLCAPSD (B$(),1)
  5379.       GR = INSTR("NAC",B$(1))
  5380.       IF GR = 0 THEN _
  5381.          GOTO 43006
  5382.       USER.GRAPHIC.DEFAULT$ = MID$(" GC",GR,-(GR > 1))
  5383.       GR = GR-1
  5384. 43020 A$ = "GRAPHICS: " + MID$("None AsciiColor",GR*5 + 1,5)
  5385.       GOSUB 12979
  5386.       RETURN
  5387. 43025 GOSUB 43030
  5388. '
  5389. ' *****************************************************************************
  5390. ' *  DISPLAY NON-BREAKABLE TEXT FILES                                         *
  5391. ' *****************************************************************************
  5392. '
  5393. 43027 STOP.INTERRUPTS = FALSE
  5394.       CALL BUFFILE (FILE.NAME$)
  5395.       CALL CARRIER
  5396.       IF SUBROUTINE.PARAMETER = -1 THEN _
  5397.          RETURN 10595
  5398.       STOP.INTERRUPTS = TRUE
  5399.       RETURN
  5400. 43030 CALL GRAPHIC (USER.GRAPHIC.DEFAULT$)
  5401.       RETURN
  5402. '
  5403. ' *****************************************************************************
  5404. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)                          *
  5405. ' *****************************************************************************
  5406. '
  5407. 45010 HIDDEN = TRUE
  5408.       GOSUB 12995
  5409.       HIDDEN = FALSE
  5410.       GOSUB 12979
  5411.       RETURN
  5412. '
  5413. ' *****************************************************************************
  5414. ' *  XMODEM / CRC INTERFACE                                                   *
  5415. ' *****************************************************************************
  5416. '
  5417. 46000 XMODEM.CHECKSUM = 0
  5418.       CRC.VALUE = 0
  5419.       CALL XMODEM(WK$,XMODEM.CHECKSUM,CRC.VALUE,CRC.HIGH,CRC.LOW)
  5420.       RETURN
  5421. '
  5422. ' *****************************************************************************
  5423. ' *  DISPLAY MESSAGE & COMMENT EDIT PROMPT LINE                               *
  5424. ' *****************************************************************************
  5425. '
  5426. 50400 A$ = "A)bort, C)ontinue, D)elete, E)dit, I)nsert, L)ist, M)argin, S)ave"
  5427.       GOSUB 12975
  5428.       RETURN
  5429. '
  5430. ' *****************************************************************************
  5431. ' * UPDATE DOWNLOAD STATISTICS                                                *
  5432. ' *****************************************************************************
  5433. '
  5434. 50600 IF DOWNLOAD.COMPLETED THEN _
  5435.          CALL QTPUT ("Download successful",1):_
  5436.          DOWNLOADS = DOWNLOADS + 1 : _
  5437.          CALL MUSIC (6) : _
  5438.          Y$ = " Downloaded " _
  5439.       ELSE Y$ = " Aborted "
  5440.       IF AUTODOWNLOAD.IN.PROGRESS THEN _
  5441.          Y$ = " AUTO" + _
  5442.               MID$(Y$,2)
  5443.       IF INSTR(Y$,"Aborted") THEN _
  5444.          AUTODOWNLOAD.IN.PROGRESS = 0
  5445.       A$ = ""
  5446. 50610 IF LOCAL.USER THEN _
  5447.          RETURN
  5448.       SUBROUTINE.PARAMETER = 2
  5449.       CALL AMORPM
  5450.       CALL BRKFNAME (FILE.NAME$,DR$,X$,EXTENTION$,TRUE)
  5451.       Z$ = X$ + EXTENTION$ + Y$ + "at " + TIM$ + _
  5452.            " using " + FT$ + STR$(BYTES.IN.FILE#)
  5453.        CALL UPDTCALR (Z$,2)
  5454.       RETURN
  5455. '
  5456. ' *****************************************************************************
  5457. ' *   DIRECTORY SEARCH                                                        *
  5458. ' *****************************************************************************
  5459. '
  5460. 52900 CK = 2
  5461.       IF Q > 1 THEN _
  5462.          GOTO 52920
  5463. 52910 A$ = "Search for string"
  5464.       GOSUB 12998
  5465.       IF Q = 0 THEN _
  5466.          RETURN
  5467.       B$(2) = B$(1)
  5468. 52920 CALL ALLCAPSD (B$(),2)
  5469.       RS$ = B$(2)
  5470.       SEARCH.STRING$ = RS$
  5471.       A1$ = B$(2)
  5472.       GOTO 53007
  5473. '
  5474. ' *****************************************************************************
  5475. ' *  N - COMMAND FROM FILES MENU (DISPLAY NEW FILES SINCE LAST DIR DISPLAY)   *
  5476. ' *****************************************************************************
  5477. '
  5478. 53000 CK = 1
  5479.       IF Q > 1 THEN _
  5480.          GOTO 53005
  5481. 53002 A1$ = RIGHT$(LM$,4) + LEFT$(LM$,2)
  5482.       A$ = "Files on/after (MMDDYY, [ENTER] = last on " + A1$ + ")"
  5483.       GOSUB 12995
  5484.       IF Q = 0 THEN _
  5485.          RS$ = LM$ : _
  5486.          GOTO 53006
  5487.       B$(2) = B$(1)
  5488. 53005 IF LEN(B$(2)) <> 6 THEN _
  5489.          GOTO 53002
  5490.       A1$ = B$(2)
  5491.       RS$ = RIGHT$(A1$,2) + LEFT$(A1$,4)
  5492. 53006 SEARCH.DATE$ = RS$
  5493.       SEARCH.STRING$ = ""
  5494. 53007 IF Q > 2 THEN _
  5495.          DIR.INDEX = 3 : _
  5496.          GOTO 53030
  5497. 53010 CALL GETDIRS ("quits")
  5498.       IF Q = 0 THEN _
  5499.          RETURN
  5500.       DIR.INDEX = 1
  5501. 53030 CALL CONVDIRS (DIR.INDEX)
  5502.       LAST.DIR.POS = Q
  5503.       LIST.DIRECTORY = TRUE
  5504.       LIST.NEW = TRUE
  5505. 53035 Z$ = B$(DIR.INDEX)
  5506.       IF Z$ = "ALL" THEN _
  5507.          IF NOT LIMIT.SEARCH.TO.FMS THEN _
  5508.             GOTO 53070
  5509. 53060 LIST.INDEX = DIR.INDEX
  5510.       QX = LIST.INDEX
  5511.       GOSUB 20161
  5512.       DIR.INDEX = DIR.INDEX + 1
  5513.       IF DIR.INDEX <= LAST.DIR.POS THEN _
  5514.          GOTO 53035
  5515.       LIST.NEW = FALSE
  5516.       SEARCH.STRING$ = ""
  5517.       SEARCH.DATE$ = ""
  5518.       RETURN
  5519. 53070 G = DIR.INDEX
  5520.       J = DIR.INDEX
  5521.       B$(DIR.INDEX) = DIRECTORY.PATH$ + _
  5522.                 "*." + _
  5523.                 DIRECTORY.EXTENTION$
  5524.       GOSUB 53100
  5525.       CLS
  5526.       SUBROUTINE.PARAMETER = 1
  5527.       CALL LINE25
  5528.       QX = G
  5529.       LIST.INDEX = DIR.INDEX+1
  5530.       GOSUB 20161
  5531.       LIST.NEW = FALSE
  5532.       REDIM B$(ADIM)
  5533.       RETURN
  5534. 53100 CLS
  5535. 53101 FILES B$(J)
  5536.       X = CSRLIN
  5537.       LOCATE 2,1,1
  5538.       MAIN.DIRECTORY$ = DIRECTORY.EXTENTION$
  5539.       FOR I = 2 TO X
  5540.         FOR B = 1 TO 66 STEP 18
  5541.           G = G + 1
  5542.           B$(G) = ""
  5543.           FOR QQ = 0 TO 7
  5544.             H = SCREEN (I,(B + QQ))
  5545.             B$(G) = B$(G) + CHR$(H)
  5546.           NEXT
  5547.           IF LEFT$(B$(G),1) = " " THEN _
  5548.              G = G-1 : _
  5549.              RETURN
  5550.           WHILE RIGHT$(B$(G),1) = " "
  5551.                 B$(G) = LEFT$(B$(G),LEN(B$(G))-1)
  5552.           WEND
  5553. 53105     IF LIST.NEW THEN _
  5554.          IF (OMIT.MAIN.DIRECTORY$ = "YES" AND _
  5555.                  (B$(G) = MAIN.DIRECTORY$ OR _
  5556.                   B$(G) = MAIN.DIRECTORY$ + "G" OR _
  5557.                   B$(G) = MAIN.DIRECTORY$ + "C")) OR _
  5558.         (USER.SECURITY.LEVEL < MIN.SEC.TO.VIEW AND _
  5559.                  (B$(G) = UPLOAD.DIR.CHECK$ OR _
  5560.                   B$(G) = UPLOAD.DIR.CHECK$ + "G" OR _
  5561.           B$(G) = UPLOAD.DIR.CHECKS$ + "C")) THEN _
  5562.                     G = G-1 : _
  5563.                     GOTO 53110
  5564. 53110   NEXT
  5565.       NEXT
  5566.       RETURN
  5567.  
  5568. '
  5569. ' *****************************************************************************
  5570. ' *  DISPLAY CALLERS FILE                                                     *
  5571. ' *****************************************************************************
  5572. '
  5573. 57000 CALL SKIPLINE (1)
  5574.       CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX
  5575.       CLOSE 4
  5576.       OPEN "R",4,CALLERS.FILE$,64
  5577.       FIELD 4,64 AS CALLERS.RECORD$
  5578. 57005 IF CALLERS.FILE.INDEX.TEMP  < 1 OR _
  5579.          RET THEN _
  5580.          RETURN
  5581. 57010 GET 4,CALLERS.FILE.INDEX.TEMP
  5582.       A$ = CALLERS.RECORD$
  5583.       IF LEFT$(A$,3) = SPACE$(3) OR _
  5584.          INSTR(A$,"on at") = 0 THEN _
  5585.          GOTO 57030
  5586. 57025 CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX.TEMP - 1
  5587.       GET 4,CALLERS.FILE.INDEX.TEMP
  5588.       Z = INSTR(CALLERS.RECORD$,"{")
  5589.       IF Z < 1 OR Z > 15 THEN _
  5590.          Z = 15
  5591.       IF SYSOP OR _
  5592.          LEFT$(A1$,3) <> "   " THEN _
  5593.          A$ = A$ + LEFT$(CALLERS.RECORD$,Z-1)
  5594.       GOSUB 57100
  5595.       IF SYSOP THEN _
  5596.          A$ = MID$(CALLERS.RECORD$,Z) : _
  5597.          GOSUB 57100
  5598.       GOTO 57045
  5599. 57030 IF SYSOP THEN _
  5600.          GOSUB 57100
  5601. 57045 CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX.TEMP -1
  5602.       GOTO 57005
  5603. 57100 CALL QTPUT (A$,1)
  5604. 57110 IF LINES.PRINTED >= PAGE.LENGTH THEN _
  5605.          IF NON.STOP THEN _
  5606.             LINES.PRINTED = 0 : _
  5607.             CALL CARRIER : _
  5608.             IF SUBROUTINE.PARAMETER THEN _
  5609.                RETURN 10595 _
  5610.             ELSE _
  5611.                RETURN _
  5612.          ELSE _
  5613.             GOSUB 5600 : _
  5614.          IF NO THEN _
  5615.             RETURN 57120
  5616. 57120 RETURN
  5617. '
  5618. ' *****************************************************************************
  5619. ' *  TEST FOR FUNCTION KEY PRESSED                                            *
  5620. ' *****************************************************************************
  5621. '
  5622. 60000 CALL FINDFUNC
  5623. 60010 IF LEN(KEY.PRESSED$) <> 2 THEN _
  5624.          RETURN
  5625.       ON FUNCTION.KEY GOSUB 31000, _            ' F1
  5626.                             32000, _            ' F2
  5627.                             33000, _            ' F3
  5628.                             33040, _            ' F4
  5629.                             33060, _            ' F5
  5630.                             33070, _            ' F6
  5631.                             33090, _            ' F7
  5632.                             33110, _            ' F8
  5633.                             33130, _            ' F9
  5634.                             33150, _            ' F10
  5635.                             1398, _             ' END KEY
  5636.                 33200               ' PGUP
  5637.       KEY.PRESSED$ = ""
  5638.       RETURN
  5639. '
  5640. ' *****************************************************************************
  5641. ' *  REPLY TO MESSAGE SAVE ORIGINAL ATTRIBUTES                                *
  5642. ' *****************************************************************************
  5643. '
  5644. 62520 SQ = Q
  5645.       LG$(10) = B$
  5646.       LINES.IN.MESSAGE.SAVE = LINES.IN.MESSAGE
  5647.       SL = S
  5648.       NON.STOP.SAVE = NON.STOP
  5649.       MESSAGE.DIM.INDEX.SAVE = MESSAGE.DIM.INDEX
  5650.       RETURN
  5651. '
  5652. ' *****************************************************************************
  5653. ' *  REPLY TO MESSAGE RESTORE ORIGINAL ATTRIBUTES                             *
  5654. ' *****************************************************************************
  5655. '
  5656. 62530 Q = SQ
  5657.       B$ = LG$(10)
  5658.       LINES.IN.MESSAGE = LINES.IN.MESSAGE.SAVE
  5659.       S = SL
  5660.       NON.STOP = NON.STOP.SAVE
  5661.       MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX.SAVE
  5662.       KILL.MESSAGE = FALSE
  5663.       RETURN
  5664. '
  5665. ' *****************************************************************************
  5666. ' *  TEST FOR EXIT TO DOS                                                     *
  5667. ' *****************************************************************************
  5668. '
  5669. 63000 OLD.DAT$ = MID$(MESSAGE.RECORD$,76,10)
  5670.       OLD.TIME = VAL(MID$(MESSAGE.RECORD$,86,5))
  5671.       NEW.TIME = VAL(LEFT$(TIME$,2)) * 100 + VAL(MID$(TIME$,4,2))
  5672.       IF OLD.DAT$ = DATE$ THEN _
  5673.          RETURN
  5674.       IF NEW.TIME < OLD.TIME THEN _
  5675.          RETURN
  5676.       MID$(MESSAGE.RECORD$,76,10) = DATE$
  5677.       MID$(MESSAGE.RECORD$,86,5) = STR$(TIME.TO.DROP.TO.DOS)
  5678.       SHELL "RBBSTIME"
  5679.       RETURN
  5680.